c语言写一个1. 定义单向循环链表节点类型。 2.. 尾插法创建单向循环链表并返回尾指针。 3. 定义打印输出单向循环链表节点。 4. 在main函数中编写测试 (1)分别创建循环链表La 和Lb (2)编写合并算法,存储到Lc (3)编写输出Lc验证合并结果 源代码要有详细注释
时间: 2024-09-24 16:09:32 浏览: 93
在C语言中,我们可以按照以下步骤来实现一个简单的单向循环链表:
首先,我们定义一个单向循环链表节点类型(Node结构体),包含数据域(data)和指向下一个节点的指针(next)以及一个额外的指针(prev),因为它是循环链表。
```c
// 定义单向循环链表节点类型
typedef struct Node {
int data; // 节点的数据域
struct Node* next; // 指向下一个节点
struct Node* prev; // 指向前一个节点 (循环链表特点)
} Node;
```
接下来,我们编写一个函数`createList`,通过尾插法创建循环链表,并返回尾指针。
```c
// 尾插法创建循环链表
Node* createList(int data[], int size) {
Node* head = NULL, *tail = NULL; // 初始化头和尾都为空
for (int i = 0; i < size; ++i) {
Node* newNode = malloc(sizeof(Node));
newNode->data = data[i];
newNode->next = head; // 新节点的next指向前一个节点
newNode->prev = tail; // 新节点的prev指向当前节点
if (head == NULL) { // 如果链表为空
head = tail = newNode;
} else {
tail->next = newNode; // 非空链表,尾部的next指向下新插入的节点
tail = newNode; // 更新尾指针
}
}
return head;
}
```
为了打印链表,我们可以定义一个辅助函数`printList`:
```c
void printList(Node* node) {
while (node != NULL) {
printf("%d ", node->data);
node = node->next; // 移动到下一个节点
}
printf("\n"); // 打印换行符
}
```
在主函数`main`中,我们将创建两个循环链表La和Lb,然后合并它们:
```c
int main() {
int data1[] = {1, 2, 3};
int size1 = sizeof(data1) / sizeof(data1[0]);
int data2[] = {4, 5, 6};
int size2 = sizeof(data2) / sizeof(data2[0]);
Node* La = createList(data1, size1);
Node* Lb = createList(data2, size2);
// 合并两个链表(这里简化处理,仅示例,实际操作需考虑链表长度)
Node* Lc = La;
while (Lb != NULL) {
Node* temp = Lb;
Lb = Lb->next;
temp->next = Lc;
Lc->prev = temp;
Lc = temp;
}
Lc->next = La; // 闭合链表
// 输出合并后的链表Lc
printList(Lc);
free(La); // 释放La资源
free(Lb); // 释放Lb资源
return 0;
}
```
阅读全文