所謂迴圈鏈表就是尾結點與頭結點相連的鏈表,整個鏈表形成一個環。而對於迴圈鏈表的插入與刪除運算,基本上與單鏈表相同,只是在判斷鏈表是否結束有所不同。下面的代碼操作實現了兩個迴圈單鏈表的合并。且核心代碼不多,主要是分別找到迴圈單鏈表的尾結點再進行後續操作。
#include <stdio.h>#include <stdlib.h>typedef struct list{char data;struct list *next;}linklist;linklist *CreateLinklist_End(int *l);//尾插法建立單迴圈鏈表linklist *Linklist_Connect(linklist *h1,int l1, linklist *h2, int l2);//單迴圈鏈表的合并void ShowLinklist(linklist *h);//輸出顯示鏈表int main(void){linklist *head1, *head2;int length1, length2;//分別記錄兩個迴圈鏈表的長度printf("迴圈單鏈表的操作練習:\n");printf("建立兩個單迴圈鏈表:\n");printf("第一個鏈表資料輸入(請依次輸入字元資料,'#'號結束):\n");head1 = CreateLinklist_End(&length1);getchar();//消除斷行符號鍵為後面輸入帶來的影響printf("第二個鏈表資料輸入(請依次輸入字元資料,‘#’號結束):\n");head2 = CreateLinklist_End(&length2);printf("第一個鏈表的資料依次為:\n");ShowLinklist(head1);printf("其節點數目為:%d\n", length1);printf("第二個鏈表的資料依次為:\n");ShowLinklist(head2);printf("其節點數目為:%d\n", length2);printf("第一個鏈表和第二個鏈表的合并輸出為:\n");head1 = Linklist_Connect(head1, length1, head2, length2);ShowLinklist(head1);return 1;}//尾插法建立迴圈單鏈表,參數l表示建立鏈表的長度linklist *CreateLinklist_End(int *l){linklist *head, *p, *e;char ch;*l = 0;head = (linklist*)malloc(sizeof(linklist));e = head;ch = getchar();while(ch != '#'){*l = *l + 1;p = (linklist*)malloc(sizeof(linklist));p->data = ch;e->next = p;e = p;ch = getchar();}e->next = head;//迴圈鏈表的尾結點指標域指向前端節點return head;}//單迴圈鏈表的合并linklist *Linklist_Connect(linklist *h1, int l1, linklist *h2, int l2){linklist *p1, *p2;int l=1;p1 = h1->next;while(l<l1)//找到鏈表1的尾結點{l++;p1 = p1->next;}p2 = h2->next;l = 1;while(l<l2)//找到鏈表2的尾結點{l++;p2 = p2->next;}p1->next = p2->next->next;//核心操作:鏈表1的尾結點指向鏈表2輔助前端節點的下個節點p2->next = h1;//鏈表的尾結點指向鏈表1的輔助前端節點free(p2->next);//釋放鏈表的輔助前端節點return h1;}//輸出顯示鏈表void ShowLinklist(linklist *h){linklist *p;p = h->next;while(p != h)//迴圈單鏈表的結束判斷標誌為不等於前端節點{printf("%c ", p->data);p = p->next;}printf("\n");}