我看到了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内存,您自己的列表可能是拥有列表,对吧?

10-06 13:33