合并循环链表A和B
2013-06-09 21:22 Keiven_LY 阅读(3368) 评论(0) 收藏 举报目的:
将两个用尾指针表示的循环链表A和B合并成一个新的循环链表C
思想:
1、将A的尾指针reara指向B的首元节点,同时释放B的头节点的存储空间;
2、将B的尾指针rearb指向A的头节点
3、合并后的链表C的尾指针仍为rearb
程序源码:
#include<stdio.h> #include<malloc.h> #include<stdlib.h> typedef int elementtype; /* 自定义类型 这里将elementtype定义为int类型 */ typedef struct CNode { elementtype data; struct CNode *next; }CNode; CNode *crt_linklist() /* 创建尾指针表示的循环链表 */ { CNode *rear; /* 定义尾指针 */ int a; /* 链表节点数据元素 */ CNode *p; rear=(CNode*)malloc(sizeof(CNode)); /* 为为指针节点分配内存空间 */ rear->data=-1; /* 区分节点为尾指针节点的标志 */ rear->next =rear; printf("请输入循环链表的元素(以-1结束):\n"); scanf_s("%d ",&a); while(a!=-1) { p=(CNode*)malloc(sizeof(CNode)); p->data=a; p->next=rear->next; rear->next=p; scanf_s("%d",&a); } p=rear; while(p->next!=rear) { p=p->next; } return p; } CNode *merge_rear(CNode *reara, CNode *rearb) //将两个循环链表合并成一个新的循环链表 { CNode *p; p=reara->next; //指针p用来保存链表a的头节点地址 reara->next=rearb->next->next; //链表a的尾节点下一节点接链表b的第一个数据节点 free(rearb->next); //释放链表b的头节点的存储空间 rearb->next=p; //链表b的尾节点的下一节点接链表a的头节点 return rearb; //返回新链表的尾指针 } void print(CNode *cl) { CNode *p; p=cl->next->next; while(p!=cl->next) { printf("%d ",p->data); p=p->next; } printf("\n"); } main() { CNode *clista,*clistb,*clistc; printf("建立循环链表A,请输入数据!\n"); clista=crt_linklist(); printf("建立的循环链表A为:\n"); print(clista); printf("\n建立循环链表B,请输入数据!\n"); clistb=crt_linklist(); printf("建立的循环链表B为:\n"); print(clistb); clistc=merge_rear(clista,clistb); printf("\n链表A和B合并后的新链表C为:\n"); print(clistc); system("pause"); }
结果显示:
浙公网安备 33010602011771号