C++开发学习内容

面临着找实习,很多东西需要复习, 特写此博客,将一些需要温习的知识点罗列出来,供自身学习,其中部分知识点摘自他人的博客,文章中有注明出处(若侵犯原作者相关权益,可联系博主删除),若有出错,还望各位点明。

Linux 常用指令学习

Linux 50个常用指令

TCP/IP协议学习

TCP/IP协议三次握手与四次握手流程解析

链表的操作

ps:增删这一块,写的没有那么健壮,有些可能出现的问题,我没有加上判断,只是单纯试试能不能实现功能,
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<map>
#include<string>
#include<iostream>
#include<cmath>
using namespace std;
typedef struct lnode{
    int data;
    struct lnode *  next;
}LNode,*LinkList;

LinkList create(){
    LNode *s,*r;
    LinkList L=NULL;
    int x;
    while(~scanf("%d",&x)){
        if(x==0)
            break;
        s=(LNode * )malloc(sizeof(LNode));
        s->data=x;
        if(L==NULL)
            L=s;
        else
            r->next = s;
        r=s;
    }
    if(r->next!=NULL)  r->next=NULL;
    return L;
}

void print(LinkList L ){
    LNode *s;
    s=L;
    while(s){
        printf("%d\n",s->data);
        s=s->next;
    }
}

void add(LinkList L ,int i, int data){
    LNode *p=L;
    int j=0;
    while(p->next&&j<i-1)
    {
        p=p->next;
        j++;
    }
    LNode *s;
    s=(LNode *) malloc(sizeof(LNode));
    s->data=data;

    s->next=p->next;
    p->next=s;
}

void del(LinkList L,int i){
    LNode *p=L;
    int j=0;
    while(p->next&&j<i-1){
        p=p->next;
        j++;
    }

    LNode *s;
    s=p->next;
    p->next=s->next;
    free(s);
}
int main()
{
    LinkList L=create();
    print(L);
    add(L,1,10);
    print(L);
    del(L,3);
    print(L);

}

排序的实现

  1. 冒泡排序:
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<map>
#include<string>
#include<iostream>
#include<cmath>
#include<ctime>
using namespace std;
int main()
{
    srand((unsigned)time(NULL));
    int a[20];
    for(int i=0;i<20;i++){
        a[i]=rand()%101;
    }
    for(int i=0;i<20;i++){
       printf("%d ",a[i]);
    }
    printf("\n");
    for(int i=0;i<20-1;i++)
    for(int j=0;j<20-i-1;j++){
        if(a[j]>a[j+1])
            swap(a[j],a[j+1]);
    }
    for(int i=0;i<20;i++){
       printf("%d ",a[i]);
    }
    printf("\n");



}

2.快速排序(随机快排)

#include<cstdio>
#include<algorithm>
#include<cstring>
#include<map>
#include<string>
#include<iostream>
#include<cmath>
#include<ctime>
using namespace std;
void quickSort(int a[],int l,int r)  //随机化快排
{
    if(l<r)
    {
        int t=rand()%(r-l+1)+l;  //在l-r中随机选取一个元素与a[l]交换
        swap(a[t],a[l]);
        int i=l,j=r,x=a[l];
        while(i<j)
        {
            while(i<j&&a[j]>=x) //从右往左找第一个小于x的值
                j--;
            if(i<j)
            {
                a[i++]=a[j];   //因为a[l]的值已经保存在x中了,因此整个数组里就会留下一个位置进行数据交换
            }

            while(i<j&&a[i]<x) //从左往右找第一个大于等于x的值
                i++;
            if(i<j)
            {
                a[j--]=a[i];
            }
        }
        a[i]=x;   //循环完成后,i之前的元素都小于x,i之后的元素都大于x
        quickSort(a,l,i-1);
        quickSort(a,i+1,r);

    }
}
int main()
{
    srand((unsigned)time(NULL));
    int a[20];
    for(int i=0; i<20; i++)
    {
        a[i]=rand()%101;
    }
    for(int i=0; i<20; i++)
    {
        printf("%d ",a[i]);
    }
    printf("\n");
    quickSort(a,0,20-1);
    for(int i=0; i<20; i++)
    {
        printf("%d ",a[i]);
    }
    printf("\n");



}


哈夫曼树的构造

构造哈夫曼树的样例分析

二叉搜索树的创建

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<iostream>
#include<cmath>
#include<cstdlib>

using namespace std;

struct Binary_Node{
    int data;
    Binary_Node *left;
    Binary_Node *right;
};


Binary_Node* createBinaryTree(int data,Binary_Node *root){
    if(root==NULL)
    {
        root=(Binary_Node*)malloc(sizeof(Binary_Node));
        root->left=NULL;
        root->right=NULL;
        root->data=data;
    }

    else if(data<root->data){
        root->left=createBinaryTree(data ,root->left);
    }
    else
        root->right=createBinaryTree(data,root->right);
    return root;
}

void print(Binary_Node *root){
    if(root!=NULL)
    {
        print(root->left);
        printf("%d\n",root->data);
        print(root->right);

    }
}

int main ()
{
    Binary_Node *root=NULL;
    int a[]={10,14 ,16,12,6,4,8};
    for(int i=0;i<7;i++)
        root=createBinaryTree(a[i],root);
    print(root);
    return 0;
}

二叉搜索树与双向链表

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<iostream>
#include<cmath>
#include<cstdlib>

using namespace std;

struct Binary_Node{
    int data;
    Binary_Node *left;
    Binary_Node *right;
};

Binary_Node* createBinaryTree(int data,Binary_Node *root){
    if(root==NULL)
    {
        root=(Binary_Node*)malloc(sizeof(Binary_Node));
        root->left=NULL;
        root->right=NULL;
        root->data=data;
    }

    else if(data<root->data){
        root->left=createBinaryTree(data ,root->left);
    }
    else
        root->right=createBinaryTree(data,root->right);
    return root;
}

//convertNode ,将一个二叉树转换成双向链表.

void convertNode(Binary_Node *node ,Binary_Node **lastNode){
    //第二个参数是二重指针,因为后续代码需要更改指针的值所以,需要二重指针,若使用一重指针,则只改变了形参指针的值并未真正的修改实参指针的值,即真正修改指针的值用二重指针
    if(node==NULL)
        return ;
    Binary_Node *current=node;
    if(current->left!=NULL)
        convertNode(current->left,lastNode);
    current->left=*lastNode;
    if((*lastNode)!=NULL)
        (*lastNode)->right=current;
    *lastNode=current;
    if(current->right!=NULL)
        convertNode(current->right,lastNode);
}

//将表头指针反过来(上面的函数最终指向链表的尾节点)
Binary_Node * convert(Binary_Node *root){
    Binary_Node *lastNode=NULL;
    convertNode(root,&lastNode);
    Binary_Node *head=lastNode;
    while(head!=NULL&&head->left!=NULL)
        head=head->left;
    return head;
}

//打印双向链表
void printList(Binary_Node *root){
    while(root!=NULL){
        printf("%d\n",root->data);
        root=root->right;
    }
}


void print(Binary_Node *root){
    if(root!=NULL)
    {
        print(root->left);
        printf("%d\n",root->data);
        print(root->right);

    }
}



int main ()
{
    Binary_Node *root=NULL;
    int a[]={10,14 ,16,12,6,4,8};
    for(int i=0;i<7;i++)
        root=createBinaryTree(a[i],root);
    print(root);

    root=convert(root);
    printList(root);
    return 0;
}

面试遇到的一些题

写一个对链表的快排:参照大佬的博客

在一个单向链表中找倒数第k个数:很好的图解

N个乱序的数字中寻找最大的k个数:

思路:维护一个大小为k的小根堆,堆顶元素是最大K 个数中最小的一个,即第K个元素
处理过程对于数组中的每一个元素X,判断与堆顶的大小
如果X 比堆顶小,则不需要改变原来的堆, 因为这个元素比最大的K 个 数小。
如果X比堆顶大,要用X 替换堆顶的元素Y 。调整堆的时间复杂度为O(log2K)。
时间复杂度: O (N * log2 K ),算法只需要扫描所有的数据一次
空间复杂度:大小为K的数组,只需要存储一个容量为K 的堆。
注意、大多数情况下,堆可以全部载入内存。如果K 仍然很大,我们可以尝试先找最大的K ’个元素,然后找第K ’+1个到第2 * K ’
元素,如此类推(其中容量K ’的堆可以完全载入内存)。这时,每求出K’个数,就遍历一遍数据了

socket编程

linux下socket编程学习

windows下socket编程学习

自己写的socket聊天通讯代码(C++)

C++多线程编程

C++多线程编程

待更新……

猜你喜欢

转载自blog.csdn.net/sinat_35866463/article/details/79843039