链接列表:从头开始插入

问题描述:

我有两种从头开始插入节点的方法。第一个工作,而第二个不工作。你能解释我为什么吗?链接列表:从头开始插入

(名单已经有一些元素和头部是链表的头节点)

而且我喜欢这个

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')时,你会怎么想呢? –

插入g到链表前面的节点要求你更新head指针,即第一个节点的地址。

您的破坏的实现永远不会更新函数外的头指针,只会更新它的本地副本,因此实现不完整。

第一次收到指针指向头指针,而第二个版本收到拷贝的头指针。因此,第一个版本可以修改头指针,而第二个版本只能修改本地副本:head = node

为了使第二个版本的工作,你可以接受head指针引用:只选择函数签名void push(list * & head, int info)(注意&)

您可能想了解更多关于pointersreferences的信息。

下面的代码示例显示您的基本按值和通过引用传递参数的:

由指针:

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

因为你想修改一个指针,那么你需要传递这个指针的地址,然后你得到一个指向指向列表的指针 –