版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/a1135004584/article/details/79329519
循环链表的和并:只需把将链表2的最后一个节点的下一个节点等于链表1的头结点的下一个节点,
链表1的头结点的下一个节点 = 链表2的头结点的下一个节点,
最后将链表2的头结点给释放掉就实现了循环链表的合并操作。
图示:
图画的比较潦草。汗!
实现代码:
main5.c
#include <stdio.h> #include <malloc.h> #include <stdlib.h> #include <time.h> /** * 循环链表 */ typedef struct cirNode{ int id;//标号 struct cirNode * next; } *CirLinkList; //尾插法添加元素 void addNode(CirLinkList cirLinkList,int id); //两个循环链表合并 void sumLinkList(CirLinkList cl1,CirLinkList cl2); void traverse(CirLinkList cll,void(*pfun)(int)); void initLinkList(struct cirNode ** linkList); /** * 随机生成节点 * @param cll * @param count */ void randomGenerated(CirLinkList cll,int count); void pfun(int data) ; int main(void) { CirLinkList cl1=NULL,cl2=NULL; initLinkList(&cl1); initLinkList(&cl2); randomGenerated(cl1,10); randomGenerated(cl2,10); traverse(cl1,pfun); printf("\n"); traverse(cl2,pfun); printf("\n"); sumLinkList(cl1,cl2); traverse(cl1,pfun); printf("\n"); return 0; } void pfun(int data) { printf("%d ",data); } //头插法添加元素 void addNode(CirLinkList cirLinkList,int id) { struct cirNode * cn = (struct cirNode *)malloc(sizeof(struct cirNode)); cn->id = id; cn->next = cirLinkList->next; cirLinkList->next = cn; } /** * 将两个不空的循环链表拼接起来 * @param cl1 * @param cl2 */ void sumLinkList(CirLinkList cl1,CirLinkList cl2) { struct cirNode *cn1,*cn2; cn2 = cl1->next; cl1->next = cl2->next; cn1 = cl2->next; while(cn1->next != cl2) cn1 = cn1->next; cn1->next = cn2; free(cl2); } void traverse(CirLinkList cll,void(*pfun)(int)) { struct cirNode *cn = cll->next; while(cn != cll) { pfun(cn->id); cn = cn->next; } } void randomGenerated(CirLinkList cll,int count) { //srand((unsigned)time(NULL));//置随机数种子 int k=0; for(int i=0;i<count;i++) { k = rand()%count;//获取0-count以内的数 addNode(cll,k); } } void initLinkList(struct cirNode ** linkList) { (*linkList) = (CirLinkList)malloc(sizeof(struct cirNode));//生成一个头结点 (*linkList)->next = *linkList; }
运行结果: