本段落详细介绍如何在数据结构中实现双向链表的基本操作,包括其初始化、节点添加与移除以及内存释放等关键步骤。
以下是关于双向链表的创建、插入、删除及销毁操作的一个代码示例(包括详细的注释),适合初学者理解并使用,已经通过测试。
```c
#include
#include
// 定义双向链表节点结构体
typedef struct Node {
int data; // 存储的数据
struct Node *prev; // 指向前面的指针
struct Node *next; // 指向后面的指针
} node;
// 函数声明
node* createNode(int value); // 创建一个新节点并初始化数据值。
void insert(node **head, int data); // 在链表头部插入一个新的元素。
void delete_node(node **head, int key); // 根据给定的键删除节点。
void destroyList(node *head); // 销毁整个双向链表。
int main() {
node* head = NULL; // 初始化头指针为NULL
insert(&head, 5);
insert(&head, 10);
printf(Before deletion: );
printList(head);
delete_node(&head, 10); // 删除值为10的节点
printf(\nAfter deletion: );
printList(head);
destroyList(head); // 销毁链表
return 0;
}
// 创建一个新节点
node* createNode(int value) {
node *new_node = (node*)malloc(sizeof(node)); // 分配内存给新的节点
if(new_node == NULL) { // 检查分配是否成功
printf(Memory allocation failed.\n);
exit(0);
}
new_node->data = value; // 初始化数据值
new_node->prev = NULL;
new_node->next = NULL;
return new_node;
}
// 在链表头部插入一个新的元素
void insert(node **head, int data) {
node *newNode = createNode(data); // 创建新的节点
newNode->next = (*head); // 将新节点的下一个指针指向当前头结点
if ((*head) != NULL)
(*head)->prev = newNode; // 如果链表非空,将原头结点的前一个指针指向新节点
(*head) = newNode;
}
// 根据给定的键删除节点
void delete_node(node **head, int key) {
node *temp = *head;
if (temp != NULL && temp->data == key)
// 如果要删除的是头结点,直接更新头指针,并释放内存。
(*head) = temp->next;
while(temp != NULL && temp->data != key) // 找到给定键的节点
temp = temp->next;
if (temp == NULL)
return; // 如果找不到该键,直接返回
if (temp->prev != NULL)
temp->prev->next = temp->next; // 更新前一个元素指向当前元素的下一个指针
if (temp->next != NULL)
temp->next->prev = temp->prev; // 更新后一个元素指向当前元素的前一个指针
free(temp); // 释放被删除节点所占内存
}
// 打印链表中的所有值
void printList(node *head) {
node* curr_node = head;
while(curr_node != NULL){
printf(%d , curr_node->data);
curr_node = curr_node->next; // 移动到下一个节点
}
}
// 销毁整个双向链表的函数实现,释放所有内存。
void destroyList(node *head) {
node* current = head;
while (current != NULL){
node* nextNode = current->next;
free(current);
current = nextNode; // 移动到下一个节点
}
}
```
这个代码示例详细地展示了如何操作双向链表,包括创建、插入、删除和销毁等基本功能。同时包含必要的注释帮助初学者更好地理解每个步骤的功能与实现方式。