資料結構學習筆記-迴圈連結串列(C語言實現)
阿新 • • 發佈:2019-01-04
迴圈連結串列的概念主要就是讓單鏈表的尾節點的指標不為空並且指向頭節點。像這樣的迴圈連結串列和普通單鏈表除了判斷條件幾乎沒有任何區別,判斷條件就是從p->next是否為空改為p->next是否等於頭節點,如果等於頭節點則迴圈結束。
#include <stdio.h> #include <stdlib.h> typedef int Eletype; typedef struct Node{ Eletype data; struct Node *next; }Node; typedef Node *linkList; void initf(linkList *l){ *l=(linkList)malloc(sizeof(Node)); //因為是迴圈連結串列,所以尾指標指向頭節點 (*l)->next=*l; linkList s; for(int i=0;i<5;i++){ s=(linkList)malloc(sizeof(Node)); s->data=rand()%100+1; s->next=(*l)->next; (*l)->next=s; } } void getfELE(linkList l,int index,Eletype *e){ int i=1; //因為頭節點無資料所以p指向l->next linkList p=l->next; //因為是迴圈連結串列,p沒有為空的時候,所以判斷條件應為p不指向頭節點的時候 while((p!=(l))&&i<index){ p=p->next; i++; } *e=p->data; } void insertfELE(linkList *l,int index,Eletype e){ int i=1; linkList p=*l; while(p&&i<index){ p=p->next; i++; } linkList s; s=(linkList)malloc(sizeof(Node)); s->data=e; s->next=p->next; p->next=s; } void deletefELE(linkList *l,int index){ int i=1; linkList p=*l; //因為是迴圈連結串列,p沒有為空的時候,所以判斷條件應為p的next不指向頭節點的時候 while((p->next!=(l))&&i<index){ p=p->next; i++; } linkList r=p->next; p->next=r->next; free(r); } void clearfAll(linkList *l){ linkList q,p=(*l)->next; //因為是迴圈連結串列,p沒有為空的時候,所以判斷條件應為p不指向頭節點的時候 while(p!=(*l)){ q=p->next; free(p); p=q; } (*l)->next=*l; } void displayfLinklist(linkList l){ Eletype e; for(int i=1;i<10;i++){ getfELE(l,i,&e); printf("%d ",e); } printf("\n"); } void main(){ linkList s,b; initf(&s); displayfLinklist(s); //測試迴圈連結串列是否初始化成功 printf("%d\n",*(s->next->next->next->next->next->next->next)); insertfELE(&s,5,1000); displayfLinklist(s); deletefELE(&s,5); displayfLinklist(s); clearfAll(&s); printf("%d\n",*(s->next)); }
將兩個迴圈連結串列合併在一起需要定義一個尾指標,正常的一個迴圈連結串列尾指標指向頭節點,將兩個迴圈連結串列合併則是讓第一個尾指標指向第二個連結串列的第一個資料節點(這裡不指向第二個連結串列的頭節點),讓第二個尾指標指向第一個連結串列的頭節點。例如有兩個迴圈連結串列記作A、B,weiA是連結串列A的尾指標,weiB是連結串列B的尾指標。合併兩個連結串列的實現程式碼如下:
p=weiA->next; p代表A的頭節點同時也是新連結串列的頭節點
weiA->next=weiB->next->next; 讓連結串列A的尾指標指向連結串列B的第一個有資料的節點
weiB->next=p; 讓連結串列B的尾指標指向連結串列A的頭節點也就是p
free(p); 將p釋放掉
***這裡p必須定義