设计一个算法,将一个双链表改建成一个循环双链表。用c语言实现
时间: 2024-10-10 13:03:52 浏览: 75
设计一个算法将一个双链表转换成循环双链表,我们需要考虑两个节点:第一个节点作为新的头节点,最后一个节点的next指针指向第一个节点,形成循环。以下是C语言的一个简单实现:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表结构体
typedef struct Node {
int data;
struct Node* prev;
struct Node* next;
} Node;
// 创建新节点
Node* createNode(int value) {
Node* newNode = (Node*)malloc(sizeof(Node));
newNode->data = value;
newNode->prev = NULL;
newNode->next = NULL;
return newNode;
}
// 将普通链表变成循环链表
void makeCircularList(Node** head) {
if (*head == NULL || (*head)->next == NULL) {
printf("链表为空或只有一个节点,无法创建循环链表.\n");
return;
}
// 找到最后一个节点
Node* last = *head;
while (last->next != *head) {
last = last->next;
}
// 将最后一位节点的next指向上一个节点,形成循环
last->next = *head;
(*head)->prev = last; // 更新头节点的前一个节点
}
// 打印链表
void printList(Node* node) {
while (node != NULL) {
printf("%d ", node->data);
node = node->next;
}
printf("\n");
}
int main() {
// 初始化一个非循环链表示例
Node* nonCyclicHead = createNode(1);
nonCyclicHead->next = createNode(2);
nonCyclicHead->next->next = createNode(3);
nonCyclicHead->next->next->next = NULL; // 设置最后一个节点
// 转换成循环链表
makeCircularList(&nonCyclicHead);
// 打印结果
printf("循环链表:");
printList(nonCyclicHead);
return 0;
}
```
在这个例子中,我们首先检查链表是否为空或只有一个节点,然后找到链表的最后一个节点。接下来,我们将最后一个节点的`next`指针指向前一个节点,形成环路。最后,打印出新的循环链表。
阅读全文