用C语言编写程序:合并两个循环列表,首先,编写一个创建循环链表的函数,在主程序中调用创建两个链表,跟创建单链表相类似,只是这里是循环链表,需要把最后的指针直到第一个节点,然后创建一个函数合并这两个循环链表,然后在主程序中把合并好的链表各节点的数据打印出来。
时间: 2024-10-15 21:08:50 浏览: 33
在C语言中,要合并两个循环链表,首先需要定义结构体表示链表节点,以及一些辅助函数。以下是步骤概述:
1. 定义`Node`结构体:
```c
typedef struct Node {
int data;
struct Node* next;
struct Node* last; // 添加指向最后一个节点的指针
} Node;
```
2. 创建循环链表的函数`createCircularList`:
```c
Node* createCircularList(int* arr, int size) {
Node* head = (Node*)malloc(sizeof(Node));
Node* current = head;
for (int i = 0; i < size; i++) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = arr[i];
newNode->next = head;
if (i == 0) {
newNode->last = newNode;
} else {
current->last->next = newNode;
newNode->last = current->last;
}
current = newNode;
}
current->last->next = head; // 关闭环
return head;
}
```
3. 合并两个循环链表的函数`mergeCircularLists`:
```c
Node* mergeCircularLists(Node* list1, Node* list2) {
if (!list1 || !list2) {
return list1 ? list1 : list2;
}
Node* tail1 = list1->last;
Node* tail2 = list2->last;
// 将第二个链表连接到第一个链表的末尾
tail1->next = list2;
tail2->last = tail1;
return list1;
}
```
4. 主程序部分:
```c
void printCircularList(Node* head) {
if (!head) return;
Node* temp = head;
do {
printf("%d ", temp->data);
temp = temp->next;
} while (temp != head);
}
int main() {
int arr1[] = {1, 2, 3};
int arr2[] = {4, 5, 6};
int size1 = sizeof(arr1) / sizeof(arr1[0]);
int size2 = sizeof(arr2) / sizeof(arr2[0]);
Node* list1 = createCircularList(arr1, size1);
Node* list2 = createCircularList(arr2, size2);
Node* mergedList = mergeCircularLists(list1, list2);
printf("Merged circular list:\n");
printCircularList(mergedList);
// Free memory
freeNodes(mergedList); // 自定义释放节点内存的函数
return 0;
}
```
在这个示例中,你需要自己编写`freeNodes`函数来释放不再使用的节点内存。
阅读全文