链接列表:从头开始插入
我有两种从头开始插入节点的方法。第一个工作,而第二个不工作。你能解释我为什么吗?链接列表:从头开始插入
(名单已经有一些元素和头部是链表的头节点)
而且我喜欢这个
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);
插入g到链表前面的节点要求你更新head
指针,即第一个节点的地址。
您的破坏的实现永远不会更新函数外的头指针,只会更新它的本地副本,因此实现不完整。
第一次收到指针指向头指针,而第二个版本收到拷贝的头指针。因此,第一个版本可以修改头指针,而第二个版本只能修改本地副本:head = node
。
为了使第二个版本的工作,你可以接受head
指针引用:只选择函数签名void push(list * & head, int info)
(注意&)。
您可能想了解更多关于pointers和references的信息。
下面的代码示例显示您的基本按值和通过引用传递参数的:
由指针:
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++中最简单的概念。
我完全理解你的例子。我之前也知道你的例子,但是让我感到困惑的是,当你传递值时,你传递了一个变量,所以它被复制。但是我在'push(head,5)'中发送变量的地址;'就像你在指针的情况下通过引用传递一样。所以无论发生什么样的变化,它都应该发生在真正的头部上吗? –
好吧现在我明白了。谢谢 –
因为你想修改一个指针,那么你需要传递这个指针的地址,然后你得到一个指向指向列表的指针 –
你是什么意思与“不工作”?你的第二个按值传递'head'指针,所以'head = node'不会有任何效果,是不是你的意思? – user463035818
在第二种情况下,您传递'head'(它是一个指针),但不传递它的地址。因此,'head'在'push()'中本地“变化,而不是在”原始“'head'上变化。 – Scheff
默认参数通过值*传递*,这意味着它们被复制。现在,如果您修改副本,原件不会更改,对吗?那么当你在第二个函数中修改变量的* copy *('head')时,你会怎么想呢? –