2014-02-07 74 views
-2

假設我在C以下實現鏈表:解除分配節點鏈表

List *create_node(int v) { 
    List *node = malloc(sizeof(List)); 
    free(node); 
    node->value = v; 
    node->next = NULL; 
    return node; 
} 

List *add_node(List *h, int v) { 
    List *node = create_node(v); 
    node->next = h; 
    return node; 
} 

,我想取消分配列表中的所有節點;我嘗試寫函數

List *remove_list(List *h) { 
    while(h != NULL) { 
      List *x; 
      x = h; 
      h = h->next; 
      free(x); 
    } 
    free(x); 

}

但它不工作。你如何取消分配鏈表中的所有節點?

+3

OMG !!這是什麼:'List * node = malloc(sizeof(List)); free(node); node-> value = v;' –

+1

'free'當你不再*需要時,而不是當你*做*時。不知道那些多餘的'free()'來自哪裏,但可能只是一個錯誤或複製粘貼問題。在'create_node'中丟失'free()'。剩下的看起來不錯,除了你的remove_list中的'free(x)'外,它甚至沒有編譯的機會,更別說導致任何問題了。 – WhozCraig

+0

編譯時出現這個錯誤:/usr/lib/gcc/i686-pc-cygwin/4.3.4/../../../libcygwin.a(libcmain.o):(.text+0xa9):未定義參考'_WinMain @ 16' collect2:ld返回1退出狀態 –

回答

1

您必須在create_node代碼本身作爲你的提領解除分配的內存越來越賽格故障:

... 
List *node = malloc(sizeof(List)); 
free(node); 
node->value = v; 
... 

您已經free D中創建,然後將所有節點解引用該位置,您remove_list不會甚至被稱爲。

+0

@MatS:那麼,你的'remove_list'似乎是正確的,只是在循環後刪除額外的'free'。 –

0

我相信remove_list中的最後一個空閒(x)應該是空閒的(h),假設您想要刪除列表頭本身。

但是List *的返回表明你可能想要在那裏返回(h)。

不清楚你想在這裏做什麼?

+0

所以你正試圖在'free(NULL)'這個循環之後說'free(h)',這是因爲循環的termiantion條件。 –

+0

@MadHatter除了有點毫無意義之外,'free(NULL)'沒問題,並且是這樣記錄的。它沒有傷害,但在這種情況下也沒有任何意義。 – WhozCraig

+0

@WhozCraig:但不會'free(NULL)'導致Seg-Fault。 –

0

假設你linllist就像

1 -> 2 -> 3 -> 4 -> NULL 

刪除任何節點,你應該確保你有下一個節點的引用時。

當刪除節點1的存儲引用時,以便在下一次刪除時,您可以使用它在列表中停止,一旦遇到NULL。

0
List *create_node(int v) { 
    List *node = malloc(sizeof(List)); 
    if(node){ 
     node->value = v; 
     node->next = NULL; 
    } 
    return node; 
} 

void remove_list(List *h) { 
    while(h != NULL) { 
     List *x; 
     x = h; 
     h = h->next; 
     free(x); 
    } 
}