编一段双向链表的C代码
时间: 2023-06-28 14:13:21 浏览: 37
以下是一个简单的双向链表的C代码实现:
```c
#include <stdio.h>
#include <stdlib.h>
// 双向链表的节点结构体
struct Node {
int data;
struct Node *prev;
struct Node *next;
};
// 在双向链表末尾添加节点
void append(struct Node **head_ref, int new_data) {
// 创建新节点
struct Node *new_node = (struct Node *)malloc(sizeof(struct Node));
struct Node *last = *head_ref;
// 设置新节点的数据和指针
new_node->data = new_data;
new_node->next = NULL;
// 如果链表为空,则将新节点作为头节点
if (*head_ref == NULL) {
new_node->prev = NULL;
*head_ref = new_node;
return;
}
// 否则,找到链表的最后一个节点
while (last->next != NULL) {
last = last->next;
}
// 将新节点添加到链表的末尾
last->next = new_node;
new_node->prev = last;
return;
}
// 在双向链表中删除指定节点
void deleteNode(struct Node **head_ref, struct Node *del) {
// 如果链表为空或指定节点为空,则返回
if (*head_ref == NULL || del == NULL) {
return;
}
// 如果指定节点是头节点,则将下一个节点作为新的头节点
if (*head_ref == del) {
*head_ref = del->next;
}
// 如果指定节点有前一个节点,则将前一个节点的 next 指针设置为指定节点的下一个节点
if (del->prev != NULL) {
del->prev->next = del->next;
}
// 如果指定节点有下一个节点,则将下一个节点的 prev 指针设置为指定节点的前一个节点
if (del->next != NULL) {
del->next->prev = del->prev;
}
// 释放指定节点的内存
free(del);
}
// 打印双向链表中的所有节点
void printList(struct Node *node) {
while (node != NULL) {
printf("%d ", node->data);
node = node->next;
}
}
int main() {
struct Node *head = NULL;
// 在链表末尾添加节点
append(&head, 1);
append(&head, 2);
append(&head, 3);
append(&head, 4);
append(&head, 5);
printf("Original List: ");
printList(head);
// 删除链表中的一个节点
deleteNode(&head, head->next->next);
printf("\nModified List: ");
printList(head);
return 0;
}
```
输出结果为:
```
Original List: 1 2 3 4 5
Modified List: 1 2 4 5
```