2017-10-20 117 views
1

我有兩種從頭開始插入節點的方法。第一個工作,而第二個不工作。你能解釋我爲什麼嗎?鏈接列表:從頭開始插入

(名單已經有一些元素和頭部是鏈表的頭節點)

而且我喜歡這個

list *head = new list; 

void push(list **head, int info) 
    { 
    list *node=new list; 
    node->data=info; 
    node->next=*head; 
    *head=node; 
    } 
    push(&head,5); 

和下一個初始化頭是

void push(list *head, int info) 
    { 
    list *node=new list; 
    node->data=info; 
    node->next=head; 
    head=node; 
    } 
    push(head,5); 
+2

你是什麼意思與「不工作」?你的第二個按值傳遞'head'指針,所以'head = node'不會有任何效果,是不是你的意思? – user463035818

+0

在第二種情況下,您傳遞'head'(它是一個指針),但不傳遞它的地址。因此,'head'在'push()'中本地「變化,而不是在」原始「'head'上變化。 – Scheff

+0

默認參數通過值*傳遞*,這意味着它們被複制。現在,如果您修改副本,原件不會更改,對嗎?那麼當你在第二個函數中修改變量的* copy *('head')時,你會怎麼想呢? –

回答

0

插入g到鏈表前面的節點要求你更新head指針,即第一個節點的地址。

您的破壞的實現永遠不會更新函數外的頭指針,只會更新它的本地副本,因此實現不完整。

1

第一次收到指針指向頭指針,而第二個版本收到拷貝的頭指針。因此,第一個版本可以修改頭指針,而第二個版本只能修改本地副本:head = node

爲了使第二個版本的工作,你可以接受head指針引用:只選擇函數簽名void push(list * & head, int info)(注意&)

您可能想了解更多關於pointersreferences的信息。

0

下面的代碼示例顯示您的基本按值和通過引用傳遞參數的:

由指針:

foo(int* ref) 
{ 
    *ref = 1; 
} 

void main(void) 
{ 
    int bar = 0; 
    foo(&bar); 
    print("%d",bar); //print 1 
} 

由值:

// this 'int val' will be created on the stack when the function get called and 
// the value passed to the function will be copied to the temporary val argument 
foo(int val) 
{ 
    val = 1; 
} 

void main(void) 
{ 
    int bar = 0; 
    foo(bar); 
    print("%d",bar); //print 0 
} 

在第一示例中,我們傳遞一個指向int的指針(它包含從主函數中得到的'bar'的地址),因此當我們修改refe指向的變量時我們實際上修改了'bar'

然而,在第二個例子中,我們通過的「酒吧」值在稱爲「VAL」臨時變量要被複制(「VAL」僅在功能存在「富」並且不與'bar'一樣),因此當我們對其進行修改時,從主體中看不到任何東西。

你的例子是相同的這只是你:

  • 「廉政酒吧」是「列表*頭」
  • 「詮釋*裁判」是「名單**頭」
  • 「 int val'是'list * head'

希望你有想法。如果不是你閱讀關於指針和引用,而不是C/C++中最簡單的概念。

+0

我完全理解你的例子。我之前也知道你的例子,但是讓我感到困惑的是,當你傳遞值時,你傳遞了一個變量,所以它被複制。但是我在'push(head,5)'中發送變量的地址;'就像你在指針的情況下通過引用傳遞一樣。所以無論發生什麼樣的變化,它都應該發生在真正的頭部上嗎? –

+0

好吧現在我明白了。謝謝 –

+0

因爲你想修改一個指針,那麼你需要傳遞這個指針的地址,然後你得到一個指向指向列表的指針 –