C语言实现循环链表
本文实例为大家分享了C语言实现循环链表的具体代码,供大家参考,具体内容如下
注意事项:
1、循环链表设置尾指针。由于在链表的操作过程中,尾指针会不断变化,所以在一些函数的形参中都设置指向头指针的指针。以及链表的结束判断条件变成q是否等于尾指针。
2、注意传递的实参需要取地址
3、循环链表的优势在于双链表合并,以及实现尾插法简单(首先新建结点指向头结点,然后把尾指针的next域指向该新建结点)
4、在创建链表时,使用尾插法,而不是用头插法(因为头插法很难去更新尾指针,使得最后尾指针还需额外更新一次),直接用头插法建立的是头指针,而非尾指针
代码:
#include#include typedefstructNode { intdata; structNode*next; }Node,*LinkList; LinkListCreat(); voidDestroy(LinkList*L); voidInsert(LinkList*L,intval,intindex); voidDelete(LinkList*L,intindex); voidTraverse(LinkListL); intmain() { LinkListL=Creat(); Traverse(L); Insert(&L,1,5); printf("Afterinsertingis:\n"); Traverse(L); printf("Afterdeletingis:\n"); Delete(&L,2); Traverse(L); Destroy(&L); Traverse(L); } LinkListCreat() { LinkListL=(LinkList)malloc(sizeof(Node));//用L指针指向新建结点,这里L还不算尾指针 intn; L->data=-1; L->next=L;//头结点的指针域指向头结点,注意!这里是对尾指针的初始化。 printf("Pleaseenterthenumberyouwantinput:(>5)"); scanf_s("%d",&n); printf("inputthenumber:\n"); for(inti=0;i data); p->next=L->next; L->next=p; L=p; } returnL;//返回尾结点的指针 } voidDestroy(LinkList*L) { LinkListq=(*L)->next->next; LinkListp; (*L)=(*L)->next; while(q!=(*L)) { p=q->next; free(q); q=p; } (*L)->next=(*L); } voidInsert(LinkList*L,intval,intindex) { LinkListp=(LinkList)malloc(sizeof(Node)); p->data=val; LinkListq=(*L)->next; for(inti=1;q!=(*L)&&i next; p->next=q->next; q->next=p; if(p==(*L)) (*L)=p; } voidDelete(LinkList*L,intindex) { LinkListq=(*L)->next,p; for(inti=0;i next; p=q->next; q->next=p->next; free(p); } voidTraverse(LinkListL) { LinkListq=L->next->next;//这才是首元结点 while(q!=L) { printf("%d->",q->data); q=q->next; } printf("NULL\n"); }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。