帮我用c语言实现双向链表的删除操作
时间: 2024-12-24 16:12:09 浏览: 5
在C语言中,双向链表的删除操作需要考虑链表节点的前驱和后继节点。以下是一个简单的实现,假设有一个结构体`Node`表示链表节点,包含数据`data`、指向前驱的指针`prev`和指向后继的指针`next`。
```c
#include <stdio.h>
#include <stdlib.h>
// 定义双向链表节点结构体
typedef struct Node {
int data;
struct Node* prev;
struct Node* next;
} Node;
// 删除指定节点的函数
void delete_node(Node** head, int key) {
// 检查链表是否为空
if (*head == NULL) {
printf("List is empty.\n");
return;
}
// 遍历链表寻找目标节点
Node* current = *head;
while (current != NULL && current->data != key) {
current = current->next;
}
// 如果没找到节点,则返回
if (current == NULL) {
printf("Element not found in the list.\n");
return;
}
// 处理三种情况:节点是头结点、中间节点、尾节点
if (current->prev != NULL) {
current->prev->next = current->next; // 更新前驱节点的后继
} else { // 当前节点是头结点
*head = current->next;
if (*head != NULL) (*head)->prev = NULL;
}
if (current->next != NULL) {
current->next->prev = current->prev; // 更新后继节点的前驱
} else { // 当前节点是尾节点
Node* tail = *head; // 先保存尾节点
while (tail->next != NULL) tail = tail->next;
tail->next = NULL; // 尾部无需更新prev
}
free(current); // 释放内存
}
// 示例:创建链表并删除某个节点
int main() {
Node* head = NULL;
// 创建链表...
delete_node(&head, 5); // 删除值为5的节点
// 链表处理完成后,记得添加清理代码来关闭链表
return 0;
}
阅读全文