c - 在链表删除功能中,是否必须使用free来删除一个节点?
问题描述
我看到了这个节点删除功能,并将其与我的书进行了比较。它(几乎)完全不同,我猜后者对学习很有用......?但是我不明白为什么如果只需要向前移动指针,为什么还要使用 free 。也许我错过了一些东西。
作为参考,这是我的书的删除节点功能:
char delete(ListNodePtr *sPtr, char value){
if(value == (*sPtr)->data){
ListNodePtr tempPtr = *sPtr;
*sPtr = (*sPtr)->nextPtr;
free(tempPtr);
return value;
}
else{
ListNodePtr previousPtr = *sPtr;
ListNodePtr currentPtr = (*sPtr)->nextPtr;
while(currentPtr != NULL && currentPtr->data != value){
previousPtr = currentPtr;
currentPtr = currentPtr->nextPtr;
}
if(currentPtr != NULL){
ListNodePtr tempPtr = currentPtr;
previousPtr->nextPtr = currentPtr->nextPtr;
free(tempPtr);
return value;
}
}
return '\0';
}
我还尝试完全删除 temp 变量和 free 调用,并且该函数仍然(显然)有效,因为在 print 函数中不打印“已删除”值。
一直在查看链表上的其他来源,其中许多显示了免费功能的使用,奇怪。
解决方案
Linus 描述了 Linux 内核中使用的列表。一件有趣的事情是这些是侵入性列表,这意味着列表管理代码不负责释放节点,因为列表不拥有它们。
此外,该站点上的代码不是删除节点的完整功能,而只是取消链接的行。
不过,您自己的列表可能是一个拥有列表,使用malloc()
-ed 内存,对吧?
推荐阅读
- android - 如何在安卓手机上运行 arp 命令
- mediawiki - 我正在尝试激活 MediaWiki 中的 Vector 皮肤
- python-3.x - Python - 一小时后打破循环
- javascript - 读取由 Selenium 中的 Chrome 扩展注入到 HTML 中的文本
- django - Django 模型自定义方法
- eloquent - Eloquent destroy() 不会删除数据库中的行 - Laravel 5.6
- python - 构造函数的可选变量参数
- excel - 多选下拉列表
- python - PySpark - 根据另一列中引用的列名创建列
- php - 使用 PHP 发帖时如何禁用 wordpress 的插件?