#include <stdio.h>
#include <stdlib.h>
// 双向链表节点结构体定义
typedef struct Node{
int data; // 数据域
struct Node* next; // 指向下一个节点的指针
struct Node* prev; // 指向上一个节点的指针
}Node;
// 创建一个新的双向链表节点
Node* create_node(int data){
Node* node = (Node*)malloc(sizeof(Node));
node->data = data;
node->next = NULL;
node->prev = NULL;
return node;
}
// 插入一个新节点到链表头部
void insert_node_head(Node** head, int data){
Node* node = create_node(data);
if (!(*head)){
*head = node;
return;
}
(*head)->prev = node;
node->next = (*head);
*head = node;
}
// 插入一个新节点到链表尾部
void insert_node_tail(Node** head, int data){
Node* node = create_node(data);
if (!(*head)){
*head = node;
return;
}
Node* tail = *head;
while (tail->next){
tail = tail->next;
}
tail->next = node;
node->prev = tail;
}
// 删除链表中的某个节点
void delete_node(Node** head, Node* node){
if (*head == node){
*head = node->next;
}
if (node->next){
node->next->prev = node->prev;
}
if (node->prev){
node->prev->next = node->next;
}
free(node);
}
// 输出链表中所有节点的数据
void print_list(Node* head){
printf("List Content:\n");
while (head){
printf("%d ", head->data);
head = head->next;
}
printf("\n");
}
// 搜索链表中是否包含某个值为 data 的节点
Node* search_list(Node* head, int data){
while (head){
if (head->data == data){
return head;
}
head = head->next;
}
return NULL;
}
// 释放链表内存
void free_list(Node* head){
while (head){
Node* node = head;
head = head->next;
free(node);
}
printf("List Memory Freed.\n");
}
// 测试代码
int main(){
Node* list_head = NULL;
insert_node_head(&list_head, 1);
insert_node_head(&list_head, 2);
insert_node_tail(&list_head, 3);
insert_node_head(&list_head, 4);
insert_node_tail(&list_head, 5);
print_list(list_head);
Node* node_to_delete = search_list(list_head, 2);
delete_node(&list_head, node_to_delete);
node_to_delete = search_list(list_head, 5);
delete_node(&list_head, node_to_delete);
print_list(list_head);
free_list(list_head);
return 0;
}
List Content:
4 2 1 3 5
List Content:
4 1 3
List Memory Freed.
这个双向链表示例实现了节点的创建、插入到链表的头部和尾部、删除链表中的某一节点、输出链表中所有节点数据、搜索链表中是否包含某个值为 data 的节点,以及释放链表内存。这只是一个简单的实现,不过足够说明双向链表的基本操作。