2012-03-18 16 views
0

所以我在玩弄鏈表,試圖讓我的大腦圍繞在他們身上,並且我決定爲列表中的每個節點添加「序數」值。這樣,我可以通過序號而不是價值來刪除,並且稍後再做一些其他很酷的事情。重置鏈接列表序號

只有當我從列表中刪除一個元素時,所有的序號纔會被擊暈(相當明顯),所以我認爲「好吧,我只是在不同的函數中運行列表,重新設置所有的序號的序號「。從技術上講,我可以在被刪除的元素上啓動這個函數,並將其從該節點的序號中傳遞出來以節省時間,因爲之前的節點應該是未觸及的,但現在我以不那麼優雅的方式來做,因爲我這樣說。

「你的問題是什麼?」。我知道你會問這個! 「繼續吧!」我知道你會這麼說!

測試程序,我可以鏈接到或包含在這裏,只是創建一個5個節點的列表,刪除第三個節點,然後添加一個節點到最後。

預期輸出是:DEBUG: resetting ordinals: 0 1 2 3 4

實際的輸出是:DEBUG: resetting ordinals: 1 2 4 5 5

所以,沒有任何廢話少說,下面是我的問題:爲什麼是我的預期不同的實際輸出?

void ll_fix(node_t* list) 
{ 
    node_t* root = list; 
    int ordinal = 0; 
    printf("DEBUG: resetting ordinals: "); 
    while(list->next != NULL) 
    { 
    list->ordinal = ordinal; 
    list = (node_t*)list->next; 
    printf("%d ",list->ordinal); 
    ordinal++; 
    } 
    printf("%d\n",list->ordinal); 
    list = root; // rewind the list 
} 
+0

好點,編輯預期輸出(代碼複製粘貼,所以它是真正的代碼)。 – 2012-03-18 21:52:58

回答

2

您在更改之前正在打印序號。所以你看到以前的值。

大概應該是:

list->ordinal = ordinal; 
printf("%d ",list->ordinal); 
list = (node_t*)list->next; 
ordinal++; 

這雖然不會改變最後的價值,更好的解決方法是:

while(list != NULL) { // as per wildplasser comment, I moved the check to the beginning 
    list->ordinal = ordinal; 
    printf("%d ",list->ordinal); 
    ordinal++; 
    list = list->next; 
} 
+0

仔細一看,我正在打印「list-> ordinal」並更改「序數」。我想我應該對變量進行不同的命名,以避免混淆。 – 2012-03-18 21:54:56

+0

您在打印'list-> ordinal'之前移到下一個'參見我的示例。 – MByD 2012-03-18 21:55:33

+0

@ChrisBrowne你正在改變'list',所以'list-> ordinal'不是你剛剛設置的。 +1,很好被發現。 – cnicutar 2012-03-18 21:56:05

1

您正在設置序和印刷

之間,該列表指針
while(list->next != NULL) 
{ 
    list->ordinal = ordinal; 
    list = (node_t*)list->next; 
    printf("%d ",list->ordinal); 
    ordinal++; 
} 

所以你打印錯誤的值。此外,「倒回列表」是多餘的,因爲list是一個局部變量,它不影響函數外的任何東西。

list = root; // rewind the list 
+0

它通過引用傳遞,所以倒帶不是多餘的。 – 2012-03-18 21:58:32

+0

不,你是通過值傳遞一個指針,而不是通過引用的節點。所以你可以修改節點,但不能傳遞指針。 – 2012-03-18 22:00:29

+0

你說得對。指針的值。我可以安全地從我的代碼中刪除「倒帶」位。謝謝! – 2012-03-18 22:01:56

0

你是不是在while環路測試取消引用它next之前檢查listNULL。這可能會導致分段錯誤。我會做這樣的事情:

while(list != NULL) 
    { 
    list->ordinal = ordinal; 
    printf("%d ",list->ordinal); 
    ordinal++; 
    list = list->next; 
    } 

這應該給你的輸出:

DEBUG: resetting ordinals: 0 1 2 3 4 
0

您檢查 - >下一個指針,而你應該檢查當前元素。

void ll_fix(node_t *list) 
{ 
    node_t *tmp; 
    int ordinal = 0; 
    printf("DEBUG: resetting ordinals:"); 
    for (tmp=list; tmp; tmp = tmp->next) 
    { 
    tmp->ordinal = ordinal++; 
    printf(" %d", tmp->ordinal); 
    } 
    printf("\n"); 
}