设计一个算法,将一个双链表改建成一个循环双链表,用C语言实现
时间: 2024-10-13 17:15:59 浏览: 28
设计一个算法将普通双链表(有两个指针分别指向前一个节点和下一个节点)改建成一个循环双链表,通常需要在最后一个节点的next指针上添加对头节点的引用,同时更新头节点的prev指针。以下是C语言的一个简单实现:
```c
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构
typedef struct Node {
int data;
struct Node* next;
struct Node* prev;
} Node;
// 创建新节点
Node* createNode(int value) {
Node* newNode = (Node*)malloc(sizeof(Node));
if (!newNode) {
printf("Memory allocation failed.\n");
return NULL;
}
newNode->data = value;
newNode->next = NULL;
newNode->prev = NULL;
return newNode;
}
// 将普通双链表转为循环链表
void makeCircularList(Node** head, Node* tail) {
if (*head == NULL || tail == *head) {
return; // 如果链表为空或只有一个节点,无需转换
}
// 更新尾节点的next指针指向头节点
tail->next = *head;
// 更新头节点的prev指针,使其成为尾节点的前一个节点
(*head)->prev = tail;
// 设置头节点的next和tail的prev为自身,形成循环
*head->next = *head;
tail->prev = tail;
}
// 打印链表(用于测试)
void printList(Node* node) {
while (node != NULL) {
printf("%d ", node->data);
node = node->next;
}
}
int main() {
Node* listHead = createNode(1); // 假设已有一个正常初始化的双链表
Node* lastNode = listHead; // 最后一个节点
// 添加一些节点...
for (int i = 2; i <= 5; ++i) {
Node* newNode = createNode(i);
lastNode->next = newNode;
newNode->prev = lastNode;
lastNode = newNode;
}
// 转换为循环链表
makeCircularList(&listHead, lastNode);
// 打印验证结果
printf("Original list:\n");
printList(listHead);
printf("\nCircular list:\n");
printList(listHead);
return 0;
}
```
这个程序首先创建了一个普通的双链表,然后在`makeCircularList`函数中实现了循环链表的构造。你可以通过运行`main`函数来查看原始列表和循环后的列表。
阅读全文