用C语言:编写一个算法,将两个循环链表a=(a1,a2,…an-1,an)和b= (b1,b2,…bm-1,bm)合并为一个循环链表c。
时间: 2024-03-16 17:45:52 浏览: 185
以下是用C语言编写的算法,实现将两个循环链表合并为一个循环链表:
```c
#include<stdio.h>
#include<stdlib.h>
// 定义循环链表的节点结构体
typedef struct node{
int data;
struct node *next;
}Node, *LinkList;
// 创建循环链表
LinkList createList(int n) {
LinkList head = NULL, tail = NULL, p = NULL;
int i = 0;
for (i = 0; i < n; i++) {
p = (LinkList)malloc(sizeof(Node));
printf("请输入第%d个节点的值:", i + 1);
scanf("%d", &(p->data));
p->next = NULL;
if (head == NULL) {
head = p;
tail = p;
}
else {
tail->next = p;
tail = p;
}
}
// 将尾节点的next指向头节点,形成循环链表
tail->next = head;
return head;
}
// 合并循环链表
LinkList mergeList(LinkList a, LinkList b) {
LinkList c, pa, pb;
// 取a链表的头节点作为c链表的头节点
c = a;
// 找到a链表的尾节点
while (a->next != c) {
a = a->next;
}
// 将b链表插入到a链表的尾部
a->next = b;
// 找到b链表的尾节点
while (b->next != c) {
b = b->next;
}
// 将b链表的尾节点的next指向a链表的头节点
b->next = c;
return c;
}
// 输出循环链表
void printList(LinkList head) {
LinkList p = head;
printf("链表数据为:");
do {
printf("%d ", p->data);
p = p->next;
} while (p != head);
printf("\n");
}
int main() {
int n, m;
LinkList a, b, c;
printf("请输入a链表的长度:");
scanf("%d", &n);
a = createList(n);
printf("请输入b链表的长度:");
scanf("%d", &m);
b = createList(m);
// 合并链表
c = mergeList(a, b);
// 输出合并后的链表
printList(c);
return 0;
}
```
以上是一个简单的合并循环链表的算法,具体实现过程为:先创建两个循环链表a和b,然后将b链表插入到a链表的尾部,最后将b链表的尾节点的next指向a链表的头节点,形成一个新的循环链表c,最后输出c链表的所有节点数据。
阅读全文