2013-10-12 11 views
0

該函數應該將節點插入鏈表,但它有一個錯誤,插入的節點不會顯示在鏈接列表中。錯誤在哪裏?爲什麼這個函數沒有成功地將一個節點插入到鏈表中?

int insert(struct Node *headList, int payload) { 
    struct Node *newNode; 
    newNode = malloc(sizeof(struct Node)); 
    assert (newNode != NULL); 
    newNode->payload = payload; 
    newNode->next = headList; 
    headList = newNode; 
    return 0; 
} 

我敢肯定,Node *headList是按值傳遞,因爲headList沒有這個功能之外改變,但我不知道如何解決這個問題。我需要一個指向某個指針的指針嗎?

+1

返回更新'headList'指向調用者的指針。 –

+0

...或通過地址(指針指針)傳遞頭節點,並通過解除引用來更新它。 – WhozCraig

回答

2

此函數修改struct Node,這個指針指向:

int insert(struct Node *headList, int payload) { 
    ... 
    headList = newNode; 
    ... 
} 

但是修改指針本身,你需要傳遞指針的地址初始化指針的指針:

int insert(struct Node **headList, int payload) { 
    ... 
    *headList = newNode; // <-- modifies the pointer itself 
    ... 
} 

或者你也可以使用返回值,因爲return 0似乎有點沒用處理這個問題。

+0

+1我幾乎總是使用這種方法,而不是返回值的意識形態,只是因爲我的返回值從不*無用。它與C庫中的大部分一樣,成功時返回零,錯誤時非零。將它傳回給調用方值得花費額外的時間來通過地址imho傳遞頭指針。 – WhozCraig

+0

@WhozCraig:問題是他的功能**總是**返回0 – LihO

+0

同意。我的觀點是它不應該;它應該返回錯誤/成功狀態*並且*在您這樣做的時候使用您的head-ptr-by-address方法。潛在的錯誤並不總是一個微不足道的分配失敗。它可能是一個邏輯錯誤,放棄插入,但使用頭指針是返回值的意識形態完全隱藏來自調用者的這一事實。您的示例是正確的,並且是*應該完成的方式,如果可以的話,我會再次嘗試。 – WhozCraig

1

我沒有看到任何使用return語句所以不是用指針的指針去,返回更新headList指針呼叫者

struct Node * insert(struct Node *headList, int payload) { 
    struct Node *newNode; 
    newNode = malloc(sizeof(struct Node)); 
    assert(newNode != NULL); 
    newNode->payload = payload; 
    newNode->next = headList; 
    headList = newNode; 
    return headList; 
} 

//in caller function 
    //Some code 
    headList = insert(headList,100); 

如果你是非常具體的return語句指針的指針走

int insert(struct Node **headList, int payload) { 
    struct Node *newNode; 
    newNode = malloc(sizeof(struct Node)); 
    assert (newNode != NULL); 
    newNode->payload = payload; 
    newNode->next = headList; 
    *headList = newNode; 
    return 0; 
} 

//in caller function 
//Some code 
status = insert(&headList,100); 
+1

+1在第二個示例中禁止丟失'return'語句,這是應該完成的方式(當然,檢查你的'malloc()')。 – WhozCraig

+0

@WhozCraig:請注意,第一個電話是危險的。如果'malloc()'失敗,那麼你只是用一個空指針移動你的列表的頭部,並且如果這是唯一的指針,你就不能釋放列表。第二種方法,有適當的錯誤修正(它不會返回值,但應該;它應該檢查來自'malloc()'的返回值,但不會),如果分配失敗,應該避免破壞頭部。 –

+0

@JonathanLeffler malloc失敗有希望顯而易見,但你說的是對的。你對第二種方法的觀察恰恰是我僅使用它的原因(並且誠實地說,我唯一的關於'realloc()'的婊子是哪一個imho將是完美的一體式C內存管理器,只要它的第一個參數是地址)。但更重要的是,除了僅僅分配之外的原因的失敗是不可想象的,作爲一般算法,其次是檢測這種情況的方式。只要返回原始頭指針(有些確實會)就會讓調用者無法辨別出錯。 – WhozCraig

相關問題