2016-05-27 51 views
0

如何完全销毁链接列表?例如,当我创建链接列表并调用打印列表功能时,没有任何反应,因为列表中没有任何内容。当我将节点添加到列表中时,它会将它们打印出来。但是,当我摧毁我的列表并尝试打印列表时,我预计不会再打印出任何内容,但是我会发生im seg错误。 *我的链表的头是一个虚拟节点也正确的方法来销毁链表?

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;  
    } 
} 
+1

为什么你会分配,当你试图摧毁一个listNode? –

回答

2

你因为段错误你还在试图爬下来的free“d指针,你不能做连锁。只需将第一个->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

从ckruczek发表评论后,我将此添加为评论。您也正在删除列表中的虚拟指针。那是你要的吗?也许你的打印方法应该总是显示假人,当你试图打印一个没有假人的列表时,你会得到一个段错误。首先你必须决定你的限制。 – Cristi

0

在调用destroyList之后,您会希望将List指针设置为NULL。由于它是传递值,因此必须将List指针的地址传递给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);