所謂循環鏈表就是尾結點與頭結點相連的鏈表,整個鏈表造成一個環。而對於循環鏈表的插入與刪除運算,基本上與單鏈表相同,只是在判斷鏈表是否結束有所不一樣。下面的代碼操做實現了兩個循環單鏈表的合併。且核心代碼很少,主要是分別找到循環單鏈表的尾結點再進行後續操做。指針
#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"); }