正确的方法来破坏链接列表?

时间:2016-05-27 01:58:01

标签: c arrays list

如何彻底销毁我的链表?例如,当我创建链接列表并调用打印列表功能时,没有任何事情发生,因为列表中没有任何内容。当我向列表中添加节点时,它会将它们打印出来。但是当我破坏我的列表并尝试打印列表时,我希望没有什么可以打印出来,但是我会断言。 *我的链表的头部也是一个虚拟节点

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("%d\n",List->val);        
        List = List->next;     
    }  
}

2 个答案:

答案 0 :(得分:2)

你是分裂的,因为你仍然试图爬下你不能做的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;
}

答案 1 :(得分:0)

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

<select>
    <option title="Description : " value="1">Java</option>
    <option title="Description : " value="2">PHP</option>
    <option title="Description : " value="3">Python</option>
</select>

然后你这样称呼它:

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