> 文档中心 > 链表头插法尾插法,反转单链表,C代码

链表头插法尾插法,反转单链表,C代码

#include #include typedef struct node{    int data;    struct node *next;}lnode;// 头插法创建链表lnode* createHead(){    lnode *head,*p,*q;    head=p=(lnode *)malloc(sizeof(lnode));    p->next=NULL;    for (int i = 0; i < 10; i++) { q=(lnode *)malloc(sizeof(lnode)); q->data=i; q->next=p->next; p->next=q;    }    return head;}// 尾插法创建链表lnode* createTail(){    lnode *head,*p,*q;    head=p=(lnode *)malloc(sizeof(lnode));    for (int i = 0; i < 10; i++) { q=(lnode *)malloc(sizeof(lnode)); q->data=i; q->next=NULL; p->next=q; p=q;    }    return head; //head是头}//遍历链表void print(lnode *list){    lnode *p=list->next;    while(p!=NULL){ printf("%d\n",p->data); p=p->next;    }}int main(){    lnode *list;    list=createTail();//创建一个单链表,尾插法    print(list);    return 0;}

定义结构体

//typedef 给struct node 起了个名字叫 lnode// lnoe qw 等价于 struct nodetypedef struct node{    int data; //存放数据域    struct node *next;//存放指针}lnode;

头插法(插入是逆序)

// 头插法创建链表lnode* createHead(){//定义了三个指针类型的lnode head是头指针    lnode *head,*p,*q;    head=p=(lnode *)malloc(sizeof(lnode));    p->next=NULL;    for (int i = 0; i < 10; i++) { q=(lnode *)malloc(sizeof(lnode)); q->data=i; q->next=p->next; p->next=q;    }    return head;}

尾插法(插入是正序)

// 尾插法创建链表lnode* createTail(){    lnode *head,*p,*q;    head=p=(lnode *)malloc(sizeof(lnode));    for (int i = 0; i < 10; i++) { q=(lnode *)malloc(sizeof(lnode)); q->data=i; q->next=NULL; p->next=q; p=q;    }    return head; //head是头}

遍历链表

//遍历链表void print(lnode *list){    lnode *p=list->next;    while(p!=NULL){ printf("%d\n",p->data); p=p->next;    }}

计算单链表长

int listlen(lnode *list){    lnode *p=list->next;    int len =0;    while(p!=NULL){ len++; p=p->next;    }    return len;}

统计链表中 x出现的次数

int  count_x_in_list(lnode *list,int x){    lnode *p=list->next;    int count=0;    while(p!=NULL){ if(p->data==x)     count++; p=p->next;    }    return count;}

翻转链表思路1

将原先链表遍历一遍,放到数组中,然后使用头插法,将这个数组构建成单链表
1.遍历原先链表,数据放到数组中

//翻转链表 1,2,3,4,5 变成 5,4,3,2,1lnode* fan(lnode *list){    lnode *test,*p=list->next;    int a[1000];    int i=0;    while(p!=NULL){ a[i++]=p->data; p=p->next;    }    test=headcr(a,i);    return test;}

2.使用头插法,根据数据构建一个新的链表

//头插法建立,根据数组建立单链表lnode* headcr(int a[],int len){    lnode *head,*p,*q;    head=p=(lnode *)malloc(sizeof(lnode));    p->next=NULL;    for (int i = 0; i < len; i++) { q=(lnode *) malloc(sizeof(lnode)); q->data=i; q->next=p->next; p->next=q;    }    return head;}

翻转链表思路2 新建两个指针一前一后 逐个断链再链接

// 翻转链表lnode* reverse(lnode *list){    // p是当前 ,prev是前一个 ,next是后一个    lnode *p,*prev,*next;    prev=NULL;    p=list->next;    while(p){ next=p->next; p->next=prev; prev=p; p=next;    }    return prev;}

总体

#include #include //结构体typedef struct node{    int data;    struct node *next;}lnode;// 头插法创建链表lnode* createHead(){    lnode *head,*p,*q;    head=p=(lnode *)malloc(sizeof(lnode));    p->next=NULL;    for (int i = 0; i < 10; i++) { q=(lnode *)malloc(sizeof(lnode)); q->data=i; q->next=p->next; p->next=q;    }    return head;}// 尾插法创建链表lnode* createTail(){    lnode *head,*p,*q;    head=p=(lnode *)malloc(sizeof(lnode));    for (int i = 0; i < 10; i++) { q=(lnode *)malloc(sizeof(lnode)); q->data=i; q->next=NULL; p->next=q; p=q;    }    return head; //head是头}//遍历链表(带头结点)void print(lnode *list){    lnode *p=list->next;    while(p!=NULL){ printf("%d  ",p->data); p=p->next;    }}//遍历链表(不带头结点)void print1(lnode *list){    lnode *p=list;    while(p!=NULL){ printf("%d  ",p->data); p=p->next;    }}// 计算链表长度int listlen(lnode *list){    lnode *p=list->next;    int len =0;    while(p!=NULL){ len++; p=p->next;    }    return len;}//计算单链表中出现x的次数int  count_x_in_list(lnode *list,int x){    lnode *p=list->next;    int count=0;    while(p!=NULL){ if(p->data==x)     count++; p=p->next;    }    return count;}//头插法建立,根据数组建立单链表lnode* headcr(int a[],int len){    lnode *head,*p,*q;    head=p=(lnode *)malloc(sizeof(lnode));    p->next=NULL;    for (int i = 0; i < len; i++) { q=(lnode *) malloc(sizeof(lnode)); q->data=i; q->next=p->next; p->next=q;    }    return head;}//翻转链表 1,2,3,4,5 变成 5,4,3,2,1lnode* fan(lnode *list){    lnode *test,*p=list->next;    int a[1000];    int i=0;    while(p!=NULL){ a[i++]=p->data; p=p->next;    }    test=headcr(a,i);    return test;}// 翻转链表lnode* reverse(lnode *list){    // p是当前 ,prev是前一个 ,next是后一个    lnode *p,*prev,*next;    prev=NULL;    p=list->next;    while(p){ next=p->next; p->next=prev; prev=p; p=next;    }    return prev;}int main(){    lnode *list; list=createTail();//创建一个单链表,尾插法    print(list);    //打印单链表    printf("\n");    // int len=listlen(list);//计算单链表长度    // printf("单链表长度:%d\n",len);    // int countx=count_x_in_list(list,5);    // printf("x 在链表中出现的次数%d\n",countx); //翻转链表    //  lnode* newlist= fan(list);    //  print(newlist); lnode* newlist= reverse(list);    print1(newlist);    return 0;}