2016-08-29 54 views
-2

我試圖做一個函數,將一個節點添加到列表的開頭,然後更改變量「head」(保存列表的前一個開頭)以包含新節點。爲什麼我的鏈接列表的頭部不變?

void addToStart(node * n, node * first){ 
    printf("[Before adding] Node: %d, First: %d\n",&(*n),&(*first)); 
    n->next = first; 
    first = n; 
    printf("[After adding] Node: %d, First: %d\n",&(*n),&(*first)); 
} 


int main(){ 
    node * head = createNode(0); 
    printf("This is the location of head: %d\n",&(*head)); 
    node * fred = createNode(2); 
    addToStart(fred,head); 
    traverse(head); //Displays the list starting from the given node 
    return 0; 
} 

這是輸出:

This is the location of head: 10113040                                     
[Before adding] Node: 10113072, First: 10113040                                   
[After adding] Node: 10113072, First: 10113072                                   
(0)[10113040]->NULL 

的問題是,我所期望的功能改變什麼head在指着,但實際上一切都沒有改變。

+0

'first = n'在'addToStart'中改變函數參數'first',但不是'main'中的'head'。 'first'是'head'的副本,因爲C是按值傳遞的,只有副本被改變。 –

+0

這與'void f(int n){n = 0; }'不能用於將整數設置爲零。和C中的所有東西一樣,試着首先了解'int'的情況,然後推廣到其他類型。 –

+0

你對'int'的情況是正確的,但是不是指向一個變量的指針,而不是保存變量本身?我假定傳遞一個指針變量,改變指針也會有效地改變原始變量。 –

回答

0

因爲addToStart需要將頭指針的副本設爲node *。要改變頭,你需要使用

void addToStart(node * n, node ** first){ 
          // ^
    printf("[Before adding] Node: %d, First: %d\n",&(*n),&(**first)); 
    n->next = *first; 
      //^
    *first = n; 
//^
    printf("[After adding] Node: %d, First: %d\n",&(*n),&(**first)); 
} 

編輯用C每一個函數獲取參數的自己的副本,所以真的沒有這樣的東西作爲參考像在C++或其他語言。無論你在哪裏使用參考,快速和骯髒的選項(它可能並不總是工作!)是在每個提及之前附加一個額外的*。在這裏,你想要first作爲參考。 first是一個節點指針,所以它已經是node *。要將其用作「參考」(原樣),它會獲得額外的*,因此node **。同樣,無論它在哪裏被引用,它都會得到額外的**first = ...

有關Java內部的更多信息,請參見a Java answer that's related。基本上,第一個*隱含在Java實例變量中。所以Node n;在Java是(有點)像在Node *n;在C.

希望幫助 - 絕對檢查頁面頂部的鏈接重複問題,並在那裏的答案。如果遇到另一個代碼問題,就問另一個問題!

向C嚮導注意:是的,我知道一味地加入*是個壞主意!不過,有時候這很有用。我試圖以一種將OP推進一步的方式迴應OP的評論。

+0

謝謝我明白你做了什麼..但我認爲這讓我意識到我可能有一個誤解。我認爲一個指針類似於Java中的引用變量;所以當我通過參數'node * first'和'node * n'時,不會'first = n'改變指針嗎? –

+0

@AdnanZaman編輯:) – cxw

+0

現在,這是我不知道的!哇,這使我在過去犯了很多錯誤,現在變得更有意義。這些錯誤似乎不再神祕。我想這就是他們所說的「按價值傳遞」。非常感謝! –

相關問題