链表:从头开始插入
Linked List : Inserting from the Beginning
我有两种从头插入节点的方法。第一个有效,而第二个无效。你能解释一下为什么吗?
(该列表已经有一些元素,头部是该列表的头部节点)
我已经初始化了像这样的头
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++中最简单的概念。
相关文章:
- 如何从头开始创建 avi 文件?
- 使 std::fstream 写入文件末尾,但从头开始读取
- 如何继续读取不同功能中的文件,而不是从头开始再次读取文件?
- 如何使用 picojson.h 在 c++ 中从头开始创建 json 对象
- 列表的有效性在插入后开始迭代器
- 尝试从头开始实现Leetcode的FizzBuzz多线程问题。收到"libc++abi.dylib: terminating"错误
- 从头开始为应用程序创建 docker 映像是否有意义?
- 如何创建一个循环,该循环检查每次迭代并在每次迭代后从头开始
- 如何在C++中从头开始反序列化文件(没有库)
- 从头开始为使用Qt的应用程序制作简约的构建文件
- SDL_Mixer再次播放时,从随机位置开始一段时间,然后从头开始
- 循环,使程序从头开始
- Bison-3.0.4 中的 Linux 从头开始错误 'make check'
- 从头开始为多目录项目制作 Cmake
- 链表:从头开始插入
- 从头开始创建C 背景Win32应用程序
- QPlainTextEdit-搜索文档到底,然后从头开始
- 从头开始绘制大圆圈
- 在C++中从头开始制作 TCP 套接字
- map/set迭代器不可递增,我无法从头开始重新启动映射