【问题标题】:Why is it necessary to "free" a node?为什么有必要“释放”一个节点?
【发布时间】:2021-11-23 18:16:44
【问题描述】:

给你一个指向要从 N 个节点的链表中删除的节点的指针/引用。

Input:
N = 2,
value[] = {1,2},
node = 1 ,
Output: 2

我正在写这样的代码 -

void deleteNode(Node *del)
{
    del->data=(del->next)->data;
    del->next=(del->next)->next;
}

但给出的答案是-

void deleteNode(Node *del) {    
    Node* temp = del->next;
    del->data = temp->data;
    del->next = temp->next;
    free(temp);
}

两个答案都是正确的,但不知道我的方法是对还是错?

【问题讨论】:

  • 两个代码都存在一个问题,即它们不检查 next 是否为 NULL
  • 但是你的问题是:每次调用malloc 都应该对应调用free。否则,您最终可能会耗尽内存。
  • 实际上有问题的是,它写到 next 不会是 NULL 。我的写作方式正确吗?
  • @ClickRick 由于 OP 声明“给定答案”(可能是由讲师)调用了free(),我认为可以安全地假设它是用malloc() 创建的。
  • @JohnnyMopp 大概排除了这种可能性,因为如果next 为空,您不能使用单链表以这种方式“删除”del。 (del,尽管它的名字,永远不会被删除;它被覆盖,next 被删除。)

标签: c linked-list


【解决方案1】:

您的代码存在内存泄漏。这意味着为节点分配的内存(可能是malloc)不是deleteNode 中的freed,而是对它的引用。结果是您的程序最终可能会耗尽内存并崩溃。

【讨论】:

    【解决方案2】:

    给你一个指向要从 N 个节点的链表中删除的节点的指针/引用。

    描述与给定答案不符。对于给定的答案,参数是指向要删除的节点之前的节点的指针。如果函数写成这样会更清楚:

    void deleteNode(Node *prior) {    
        Node* current = prior->next;    /* current = pointer of node to be deleted */
        if(current == NULL)             /* exit if there is no current node */
            return;
        prior->next = current->next;    /* remove node from list */
        free(current);                  /* only if node was allocated with malloc */
    }
    
    /* this line is a mistake, so I removed it */
        prior->data = current-> data
    

    这个问题是第一个节点不能删除,除非有头 |指向列表的第一个节点的虚拟节点。另一种方法是使用指向节点的指针:

    /* from the calling code */
        Node **ppdel;
        /* ... */
        ppdel = &head;                  /* if removing 1st node on list */
    /* ... or  ... */
        ppdel = &(prior->next)          /* for all but 1st node on list */
        deleteNode(Node **ppdel);
    /* ... */
    void deleteNode(Node **ppdel) {    
        Node* current = *ppdel;         /* current = pointer of node to be deleted */
        if(current == NULL)             /* exit if there is no current node */
            return;
        *ppdel = current->next;         /* remove node from list */
        free(current);                  /* only if node was allocated with malloc */
    }
    

    【讨论】:

      猜你喜欢
      • 2010-12-18
      • 1970-01-01
      • 2012-10-06
      • 1970-01-01
      • 2016-07-24
      • 2011-05-01
      • 1970-01-01
      • 2019-08-18
      • 2010-10-21
      相关资源
      最近更新 更多