我看到了this节点删除功能并将其与我的书进行比较。它(几乎)完全不同,我猜后者对学习问题很有用......?但是后来我不明白为什么 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';
}
我还尝试完全删除临时变量和自由调用,并且函数仍然(显然)有效,因为打印函数不打印“已删除”值。
一直在检查链接列表上的其他来源,其中许多显示了 free 函数的用法,很奇怪。
最佳答案
Linus 描述了在 Linux 内核中使用的列表。一件有趣的事情是那些是侵入式列表,这意味着列表管理代码不负责释放节点,因为列表不拥有它们。
此外,该网站上的代码并不是删除节点的完整功能,而只是取消链接的代码。
不过,您自己的列表可能是一个拥有列表,使用 malloc()
-ed 内存,对吧?
关于c - 链表删除函数中,删除节点是否需要使用free?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57988549/