【问题标题】:Deleting a whole linked list删除整个链表
【发布时间】:2013-10-28 14:02:46
【问题描述】:

我正在使用链表并填充结构,但是当我删除整个结构并尝试打印链表的内容(应该为空)时,会出现一个数字列表。我知道这可能是内存问题。有什么解决方法的建议吗?

删除整个链表的代码:

void destroy(set_elem *head)
{
    set_elem *current = head;
    set_elem *next;

    while (current != NULL)
    {
       next = current->next;
       free(current);
       current = next;
    }
    head = NULL;
}

【问题讨论】:

  • 删除整个结构后,就不能再打印了,仅此而已。
  • 我认为问题在于您将本地头指针设置为 NULL,而不是调用者中的头指针。你需要一个双指针。
  • 释放内存后访问内存是未定义的行为。

标签: c list pointers memory linked-list


【解决方案1】:

虽然您的 delete 函数正常工作,但当您执行 head = NULL; 时,它不会将调用者中的 head 设置为 NULL,因为您只是在修改本地指针,这会导致您稍后在其中尝试通过检查 head 的值来打印值的逻辑。

要修改原始指针,将指针传递给head并设置*head=NULL;

void destroy(set_elem **head)
{
set_elem *current = *head;

/* rest is the same */

*head = NULL;
}

【讨论】:

  • 我怎样才能用这种方法改变它?因为我迷路了!
  • @user90790 用如何修改你的函数更新了我的答案。我希望你真的明白我在之前代码部分所说的话。
  • 是的,我明白,但我的原型应该是 void destroy(set_elem* head); (给定)即使我使用了这个解决方案,我的 file.exe 也停止了工作
  • @user90790 如果您无法更改原型,请坚持使用旧功能并在调用后立即将 head 设置为 NULL:destroy(head); head=NULL; 如果您仍然有问题,那么您的问题在其他地方并发布相关编码或使用调试器。
【解决方案2】:

您只修改了本地 head 指针

使用双指针修改head,稍后用于打印/处理

void destroy(set_elem** head)
{

   set_elem* current = *head;
   set_elem* next;

   while (current != NULL)
   {
       next = current->next;
       free(current);
       current = next;
   }

   *head = NULL;
}

【讨论】:

    【解决方案3】:

    当你复制头指针传递给函数时,头节点不受影响。您必须将指针的引用传递给头,然后您才能删除头指针。这也可以通过将指针传递给指向链表头部的指针来完成,但我发现传递引用更方便。以下是对您的代码的更改。

    void destroy(set_elem*& head)
    {
    
      set_elem* current = head;
      set_elem* next;
    
      while (current != NULL)
      {
           next = current->next;
           free(current);
           current = next;
      }
    
       *head = NULL;
    }
    

    【讨论】:

    • 它给出了这个错误:在 '&' 标记之前预期的 ';'、',' 或 ')'|
    • 这是一道 C 题。此答案适用于不同的语言(可能是 C++)。
    • 嗨,这是一个 c++ 实现。您的代码不够具体,无法确定语言。我忘了看你的标签。如果你使用 c++,这应该可以工作。
    【解决方案4】:

    你并没有改变原来的头。您应该将指针传递给此头,即指向指针的指针,或者应该将更改的头返回给调用者。以下是将更改的头部返回给调用者的代码。还有其他答案显示指针方法。

      set_elem* destroy(set_elem *head) {
          set_elem *current = head;
         set_elem *next;
    
         while (current != NULL) {
             next = current->next;
             free(current);
             current = next;
         }
         head = NULL;
         return head;
       }
    

    在调用者中,

        head = destroy(head);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-07
      • 1970-01-01
      • 2019-03-10
      • 1970-01-01
      • 1970-01-01
      • 2010-11-15
      相关资源
      最近更新 更多