#include<stdio.h> /*这里定义了链表的最基础的结构体*/ typedef struct node{ int data;/*链表中的数据部分*/ struct node *next; /*链表中的连接部分,相当于上一个数据的尾部,下一个数据的头部,next为NULL则链表结束*/ }Lnode,*Linklist;/*定义*/ /*创建一个链表*/ Linklist createlinklist(int n) /*这里要说明因为返回是个指针所以Linklist用了指针定义*/ { Linklist p,r,list=NULL; /*设置temp,并且将头部list设置为NULL*/ int e,i;/*设置temp*/ for(i=1;i<=n;i++)/*控制生成几个节点*/ { scanf("%d",&e);/*获取每个节点的元素*/ p=(Linklist)malloc(sizeof(Lnode));/*创建空间*/ p->data=e;/*将元素赋值给节点中的元素*/ p->next=NULL;/*设置下一个节点的头部为NULL*/ if(!list)/*如果为第一个节点则list==p(指结构体的地址相同)*/ list=p; else/*如果下不为第一个节点则使结构体的地址传到节点的next上*/ r->next=p; r=p;/*temp。为下一个循环制造连接点*/ } return list;/*返回链表*/ } /*插入节点到链表*/ /*这里注解下:每个链表的节点都是一个完整的结构体*/ /* 又是个人见解了。这里我看书里没有完全注释我也有点看不懂,我暂时是这样理解的这里的链表指针的作用主要为确认链表是否已经到达尾部。 因为这里的第二个值 q 为链表要插入一个值这个链表就会被改变如果没有另外一个不变的值进行排断会使这个链表没有尾节点(NULL)。 同时关于插入值的位置,应该为链表的首位置。 */ void insertlist(Linklist *list,Linklist q,int e) /*插入链表函数 第一个值为链表指针 第二个为被插入的链表 第三个为数据元素*/ { Linklist p; /*temp表*/ p=(Linklist)malloc(sizeof(Lnode));/*声明temp表的内存空间*/ p->data=e;/*将数据元素放到temp链表中*/ if(!*list){/*判断*list是否已经到尾节点*/ *list=p; /*如果是将链表p赋给*list并将p的下个节点设置为NULL*/ p->next=NULL; }else{ p->next=q->next;/*将尾节点向后移动一位,具体步骤将temp节点的next设置为原节点的next(此时p=q指2个链表相同),然后设置原节点的next为temp也就是说现在这个节点的next就是原节点的首地址*/ q->next=p;/*链表的储存先进先出和栈貌似有关系*/ } } /*从链表中删除一个节点*/ void dellist(Linklist *list,Linklist q) /*第一个值为链表指针 第二值为要删除的节点*/ { Linklist r; /*temp节点*/ if(q==*list){ /*判断要删除的节点是否第一个节点*/ *list=q->next; /*如果是将节点的首地址设置为下个指针的头地址*/ free(q);/*释放q的内存*/ }else{ for(r=*list;r->next!=q;r=r->next);/*否则 将r赋为*list 并循环到指向要删除的节点*/ if(r->next!=NULL){ /*排断是否为尾节点*/ r->next=q->next;/*将q的下一节点赋值给r(此时r的next为节点q的头地址)的下一个节点(尾地址)*/ free(q);/*释放q的内存*/ } } } /*销毁一个链表*/ void destroyLinklist(Linklist *list)/*要删除的链表*/ { Linklist p,q;/*temp链表*/ p=*list;/*将*list赋值给p*/ while(p){/*如果p不为NULL将p->next指向的下一个地址赋值给q。同时释放p内存。然后将q赋值p继续循环直到尾节点*/ q=p->next; free(p); p=q; } *list=NULL;/*将头地址设置为NULL*/ } /*测试函数*/ main() { int e,i; Linklist l,q; q=l=createlinklist(1); /*将q和l同时指向创建的链表*/ scanf("%d",&e);/*插入的数值 输入0即为结束*/ while(e){ insertlist(&l,q,e); q=q->next;/*使q指向下一个节点*/ scanf("%d",&e); } q=l;/*将创建好的l链表赋值给q*/ printf("输出链表中的所有内容\n"); while(q){ printf("%d",q->data); q=q->next; } q=l; printf("\n删除第3个元素\n"); for(i=0;i<2;i++) { if(q==NULL){ printf("ERR"); getchar(); return; } q=q->next; } dellist(&l,q); q=l; while(q){ printf("%d",q->data); q=q->next; } destroyLinklist(&l);/*销毁*/ getchar(); }
输入:
1 2 3 4 5 6 7 8 9 0
输出:
输出链表中的所有内容 123456789 删除第3个元素 12456789