c - 如何在 C 中删除整个循环链表?
问题描述
我free()
对C的stdlib的功能有问题,据我所知,这个函数一次只能删除链表的给定节点,我怎样才能使用这个函数来删除整个循环链表?
我是否必须创建一个指向循环链表头部的指针并开始逐个节点地释放节点,并注意使每个指针从一个节点到下一个节点,在我可以释放该节点之前指向 NULL ?如果是这样,我该如何释放头节点?
解决方案
从理论上讲,您可以重新分配列表的整个堆内存并将其传递给空闲函数。然而,清理链表最安全的方法是迭代和释放每个节点。
这是一个析构函数的例子。
void destroy_link_list(linked_list_t** link_list)
{
node_t* head = (*link_list)->start_node;
while(head != NULL)
{
node_t* temp = head->next;
free(head->data_list);
head->data_list = NULL;
free(head);
head = temp;
}
(*link_list)->start_node = NULL;
free(*link_list);
*link_list = NULL;
}
这个链表看起来像这样
typedef struct node node_t;
struct node
{
int unique_id;
node_t* next;
void* data_list;
};
typedef struct linked_list
{
int num_nodes;
node_t* start_node;
}linked_list_t;
推荐阅读
- google-cloud-platform - 如何解决 Datafusion 上传自定义插件 502 bad gateway 错误
- python - 语音聚类的聚类算法
- mysql - 如何使用 MySQL 用新数字替换连字符前的所有数字?
- android - 如何通过 ADB 命令在 Android 9 上启用/禁用 GPS 定位服务(非 root 设备)
- android - Android Proguard 问题
- c# - 转换 ASP.NET Core ActionResult
反对过滤器中的另一种类型 - python - 正则表达式:在时间戳之间获取文本
- python - 当我在 Python 中关闭命令提示符时,如何防止命令提示符关闭?
- mongodb - 如何在mongoDB中推送除重复对象之外的对象
- rust - cargo 是否具有等效的 npm install --save 选项来自动将依赖项添加到 Cargo.toml?