链表头插法尾插法,反转单链表,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;}