链表:从头开始插入

Linked List : Inserting from the Beginning

本文关键字:插入 从头开始 链表      更新时间:2023-10-16

我有两种从头插入节点的方法。第一个有效,而第二个无效。你能解释一下为什么吗?

(该列表已经有一些元素,头部是该列表的头部节点)

我已经初始化了像这样的头

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);

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

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

您可能需要阅读更多关于指针和引用的内容。

在链表的前面插入一个节点需要更新head指针,即第一个节点的地址。

损坏的实现从不更新函数外的头指针,只更新它的本地副本,因此实现是不完整的。

以下代码示例向您展示了通过值和引用传递参数的基本方法:

按指针:

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(包含main中'bar'的地址)的指针,因此当我们修改引用所指向的变量时,我们实际上修改了main中的'bar'

然而,在第二个例子中,我们将'bar'的值传递到一个名为`val' val'只存在于函数'中,与main中的'bar'不同),因此,当我们修改它时,main中看不到任何内容。

你的例子与此相同,除了对你来说:

  • 'it-bar'是'list*head'
  • "int*ref"是"list**head">
  • "int val"是"list*head">

希望你有这个想法。如果你没有读过指针和引用,那就不是C/C++中最简单的概念。