用C语言编写算法逆置一个带头结点的双链表。
时间: 2024-04-06 22:09:28 浏览: 109
以下是使用C语言编写算法逆置带头结点的双链表的示例代码:
```c
#include<stdio.h>
#include<stdlib.h>
// 定义双链表结构体
struct ListNode {
int data;
struct ListNode *prev;
struct ListNode *next;
};
// 初始化双链表
void InitList(struct ListNode **head) {
*head = (struct ListNode*)malloc(sizeof(struct ListNode));
(*head)->prev = NULL;
(*head)->next = NULL;
}
// 向双链表中插入元素
void InsertList(struct ListNode *head, int data) {
struct ListNode *p = (struct ListNode*)malloc(sizeof(struct ListNode));
p->data = data;
p->prev = head;
p->next = head->next;
if(head->next != NULL) {
head->next->prev = p;
}
head->next = p;
}
// 双链表逆置算法
void ReverseList(struct ListNode *head) {
struct ListNode *p = head->next;
head->next = NULL;
while(p != NULL) {
struct ListNode *temp = p->next;
p->next = head->next;
if(head->next != NULL) {
head->next->prev = p;
}
head->next = p;
p->prev = head;
p = temp;
}
}
// 输出双链表中的元素
void PrintList(struct ListNode *head) {
struct ListNode *p = head->next;
while(p != NULL) {
printf("%d ", p->data);
p = p->next;
}
printf("\n");
}
int main() {
struct ListNode *head;
InitList(&head);
InsertList(head, 1);
InsertList(head, 2);
InsertList(head, 3);
InsertList(head, 4);
printf("Original List: ");
PrintList(head);
ReverseList(head);
printf("Reversed List: ");
PrintList(head);
return 0;
}
```
以上代码中,我们首先定义了双链表的结构体 `struct ListNode`,其中包含每个节点的值 `data`,以及它的前驱节点 `prev` 和后继节点 `next`。然后我们实现了初始化双链表 `InitList` 和向双链表中插入元素 `InsertList` 的函数。
接着,我们实现了双链表逆置算法 `ReverseList`,这个算法的思路是遍历整个双链表,将每个节点的前驱节点和后继节点互换,最终将头节点的后继节点指向逆置后的第一个节点。
最后,我们实现了输出双链表中的元素 `PrintList` 的函数,用于验证逆置算法的正确性。在 `main` 函数中,我们创建了一个双链表,插入了一些元素,然后输出原始的链表和逆置后的链表。
阅读全文