2016-05-27 90 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);