各类资料学习下载合集
https://pan.quark.cn/s/8c91ccb5a474
在上一篇博客中,我们探讨了链表节点的删除操作。今天,我们将继续深入,讨论两个在资源管理中至关重要的操作:清空链表 (Clear) 和 销毁链表 (Destroy)。这两个概念虽然听起来相似,但在目的和实现上有着本质的区别。简单来说:
- • 清空 (Clear):像是倒空一个瓶子里的水,瓶子本身还在,可以重新装水。它会释放所有存储数据的节点,但保留头节点,使得链表可以被复用。
- • 销毁 (Destroy):像是把瓶子和水一起扔掉,什么都不剩。它会释放包括头节点在内的所有节点,链表将不复存在,指针也应置为
NULL
,防止野指针。
接下来,让我们通过代码来彻底理解这两个操作。
一、准备工作:基础链表结构
我们依然使用之前定义的带头节点的单链表结构,并包含初始化、插入和打印函数,以便我们构建和观察链表状态。
#include <stdio.h>
#include <stdlib.h>
// 定义链表节点结构
typedef struct LNode {
int data;
struct LNode *next;
} LNode;
// 初始化一个带头节点的链表
LNode* init_link_list() {
LNode *head = (LNode*)malloc(sizeof(LNode));
if (head == NULL) {
printf("内存分配失败!\n");
return NULL;
}
head->next = NULL;
return head;
}
// 尾插法插入节点
void insert_node(LNode *head, int value) {
if (head == NULL) {
printf("错误:链表未初始化!\n");
return;
}
LNode *newNode = (LNode*)malloc(sizeof(LNode));
newNode->data = value;
newNode->next = NULL;
LNode *p = head;
while (p->next != NULL) {
p = p- >next;
}
p->next = newNode;
}
// 打印链表
void print_link_list(LNode *head) {
if (head == NULL) {
&nb