首页 > 解决方案 > 在链表删除功能中,是否必须使用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 函数中不打印“已删除”值。

一直在查看链表上的其他来源,其中许多显示了免费功能的使用,奇怪。

标签: cpointersmemory-leakslinked-listsingly-linked-list

解决方案


Linus 描述了 Linux 内核中使用的列表。一件有趣的事情是这些是侵入性列表,这意味着列表管理代码负责释放节点,因为列表不拥有它们。

此外,该站点上的代码不是删除节点的完整功能,而只是取消链接的行。

不过,您自己的列表可能是一个拥有列表,使用malloc()-ed 内存,对吧?


推荐阅读