我最近一直在研究链表和树。但我不确定何时将函数声明为:
preorder(struct node* root);
or
preorder(struct node** root);
两者的工作原理完全相同。更准确地说,我什么时候必须将我的函数设计为双指针和单指针。
谢谢。
P.S: 在链表中插入节点需要有双指针,如下所示:
insert(struct node** root,int value);
除非根节点被定义为全局值。虽然预序与单个指针配合得很好。如果有人可以以此为例进行解释,那将非常有帮助。
最佳答案
这取决于 preorder()
的作用。如果它在不修改列表/树的情况下打印一些东西,你只需要一个指针。如果有可能必须更换根,则需要双指针。
这是因为在 C 中参数是按值传递的。如果将原始变量的拷贝传递给您的函数,则不能修改原始变量:
int inc(int x)
{
x = x + 1; // this will never work
}
为了解决这个问题,您可以传入该参数的地址(指向它的指针),而不是传递参数。然后该函数可以取消引用指针并修改它指向的值。
// usage: inc(&x) where x is an int
int inc(int *ptr)
{
*ptr = *ptr + 1; // this will work
}
对于您的列表/树,您已经在使用指针。这允许您访问和修改指向的对象(例如获取/设置根的 next
成员),但不允许您修改指针本身(例如用不同的节点替换根).为此,需要引入另一个级别,即指向节点的指针。
关于c++ - 函数声明或原型(prototype)。我该如何定义它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19074895/