所谓循环链表就是尾结点与头结点相连的链表,整个链表造成一个环。而对于循环链表的插入与删除运算,基本上与单链表相同,只是在判断链表是否结束有所不一样。下面的代码操做实现了两个循环单链表的合并。且核心代码很少,主要是分别找到循环单链表的尾结点再进行后续操做。指针
#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"); }