我看到了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';
}
我还尝试完全删除temp变量和free调用,函数仍然(显然)工作,因为print函数不打印“deleted”值。
一直在查看链接列表上的其他源代码,其中很多都显示了free函数的用法,odd。
最佳答案
Linus描述了Linux内核中使用的列表。有趣的是,这些都是入侵列表,这意味着列表管理代码不负责释放节点,因为列表不拥有节点。
此外,该站点上的代码并不是一个完整的删除节点的函数,而只是用于取消节点链接的行。
不过,使用malloc()
-ed内存,您自己的列表可能是拥有列表,对吧?