C 删除整个链接列表

C 删除整个链接列表,c,list,pointers,memory,linked-list,C,List,Pointers,Memory,Linked List,我正在使用链表并填充结构,但当我删除整个结构并尝试打印链表的内容(应为空)时,会出现一个数字列表。我知道这可能是一个记忆问题。有没有关于如何修复的建议 用于删除整个链接列表的代码: void destroy(set_elem *head) { set_elem *current = head; set_elem *next; while (current != NULL) { next = current->next; free

我正在使用链表并填充结构,但当我删除整个结构并尝试打印链表的内容(应为空)时,会出现一个数字列表。我知道这可能是一个记忆问题。有没有关于如何修复的建议

用于删除整个链接列表的代码:

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

    while (current != NULL)
    {
       next = current->next;
       free(current);
       current = next;
    }
    head = NULL;
}
虽然您的delete函数工作正常,但当您执行
head=NULL时,它不会将调用者中的head设置为NULL
因为您只修改了一个本地指针,这会导致您在稍后的逻辑中尝试通过检查
head
的值来打印值

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

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

/* rest is the same */

*head = NULL;
}

您只修改本地
指针

使用双指针修改
标题
,该标题稍后将用于打印/处理

void destroy(set_elem** head)
{

   set_elem* current = *head;
   set_elem* next;

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

   *head = NULL;
}

复制传递到函数中的头指针时,头节点不受影响。您必须将对指针的引用传递给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;
}

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

  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);

删除整个结构后,就不允许再打印它了,仅此而已。我认为问题在于,您将本地头指针设置为NULL,而不是调用者中的头指针。为此,您需要一个双指针。释放内存后访问内存是未定义的行为。如何在此方法中更改它?因为我迷路了@user90790更新了我的答案,告诉我如何修改你的函数。我希望你真的理解我在代码部分之前说的话。是的,我理解,但我的原型应该是void destroy(set_elem*head);(给定)即使在我使用此解决方案时,我的file.exe也停止了working@user90790如果无法更改原型,请坚持使用旧函数,并在调用:
destroy(head)后立即将head设置为NULL;head=NULL如果您仍然存在问题,那么您的问题在其他地方,并发布相关代码或使用调试器。它给出了以下错误:预期为“;”,“,”这是一个C问题。这个答案是针对不同的语言(可能是C++)。C++,这是一个C++实现。您的代码不够具体,无法确定语言。我忘了看你的标签了。如果你使用C++,这应该有效。