C语言 销毁链表的正确方法



如何完全销毁我的链表?例如,当我创建链表并调用打印列表函数时,由于列表中没有任何内容,因此显然没有任何反应。当我将节点添加到列表中时,它会很好地打印出来。但是当我销毁我的列表并尝试打印列表时,我希望不会再次打印出来,但我有错误。*我的链表的头部也是一个虚拟节点

void destroyList(listNode *List)
{
    listNode *temp = malloc(sizeof(listNode));
    temp = List->next;
    while (List != NULL)
    {
        temp = List;
        List = List->next;
        free(temp);             
    }
}
void printList(listNode * List)
{
    List = List->next;
    while (List != NULL)
    {
        printf("%dn",List->val);        
        List = List->next;     
    }  
}

你之所以出现分段错误,是因为你仍然试图爬下你无法做到的free指针链。只需将第一个->next设置为 NULL,您就可以开始了。

void destroyList(listNode *List)
{
    listNode *temp; // removed malloc, it's not necessary.
    listNode *originalHead = List;
    temp = List->next;
    while (List != NULL)
    {
        temp = List;
        List = List->next;
        free(temp);             
    }
    originalHead->next = NULL;
}

调用 destroyList 后,您需要将 List 指针设置为 NULL。 因为它是传递 be 值,所以您必须将列表指针的地址传递到 destroyList 中。所以,我会这样做:

void destroyList(listNode **List) {
  listNode *temp1, *temp2;
  if (!List) {
    return;
  }
  temp1 = *List;
  while (temp1) {
    temp2 = temp1->next;
    free(temp1);
    temp1 = temp2 
  }
  free(*List);
}

然后你这样称呼它:

listNode *foo;
// some code
destroyList(&foo);

相关内容

  • 没有找到相关文章

最新更新