设ha=(a1,a2,...,an )和hb=(b1,b2,...,bm )是两个带头结点的循环单链表,设计一个算法将这两个表合并为带头结点的循环单链表hc,用c语言完整代码
时间: 2024-10-19 11:06:15 浏览: 85
为了合并两个循环单链表 `ha` 和 `hb`,我们可以创建一个新的链表 `hc` 并维护两个指针 `p` 和 `q` 分别指向 `ha` 和 `hb` 的头节点。当一个链表遍历完时,我们将另一个链表剩余部分接到 `hc` 的尾部。
以下是C语言的实现:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct Node {
int data;
struct Node* next;
} Node;
// 创建循环链表的新节点
Node* createLoopList(int arr[], int n) {
Node* head = (Node*)malloc(sizeof(Node));
head->data = arr[0];
head->next = head; // 设置头节点的下一个节点为自身形成循环
for (int i = 1; i < n; i++) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = arr[i];
newNode->next = head->next;
head->next = newNode;
}
return head;
}
// 合并两个循环链表
Node* mergeCircularLists(Node* ha, Node* hb) {
Node* hc = createLoopList(NULL, 0); // 初始化结果链表
Node* p = ha;
Node* q = hb;
while (1) {
if (p == NULL) {
q = q->next;
} else if (q == NULL) {
p = p->next;
} else if (p->next == p) {
p = ha; // 如果 ha 或者hb 到了尾部,切换到另一个链表继续
} else if (q->next == q) {
q = hb;
} else {
// 将一个链表的当前节点插入另一个链表之后
Node* temp = p->next;
p->next = q->next;
q->next = temp;
}
}
return hc;
}
int main() {
int a[] = {1, 2, 3};
int b[] = {4, 5, 6};
Node* ha = createLoopList(a, sizeof(a)/sizeof(a[0]));
Node* hb = createLoopList(b, sizeof(b)/sizeof(b[0]));
Node* hc = mergeCircularLists(ha, hb);
// 输出或进一步处理hc...
return 0;
}
```
阅读全文