c++ - 函数声明或原型(prototype)。我该如何定义它?

标签 c++ c function linked-list

我最近一直在研究链表和树。但我不确定何时将函数声明为:

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/

相关文章:

c++ - 我如何知道继承 boost::asio::basic_io_object 的类中的 this 成员?

c++ - 检测 typedef 的等价性

c++ - boost::function 静态成员变量

c# - 这个项目在 C 中的等效支架是什么(来自 C#)?

c - C 中使用分隔符分割字符串

c - C 中 printf 中表达式的求值

java - 新闻的代码拆分/格式 - 需要权威提及

python - 计算递归中的迭代次数

javascript - Jquery,单击时获取该元素的文本并将其存储在变量中

javascript - 自调用JavaScript函数会导致堆栈溢出异常吗