void instert(NODE**root, int value)
{
...
insert(&(*root)->left,value);
...
}
void search(NODE*root, int value)
{
...
search(root->left, value);
...
}
为什么我们在这里使用“&”:insert(&(* root) - > left,value);但我们这里不使用“&”:搜索(root-> left,value);
为insert
函数添加了额外的间接级别,以便它可以修改指针。在search
函数的情况下,这不是必需的,因为它永远不会修改传递给它的指针。
具体来说,需要在insert
函数中有一个这样的地方:
*root = malloc(sizeof(NODE));
(*root)->left = NULL;
(*root)->right = NULL;
(*root)->value = value;
这将修改指针指向指针的指针。
注意,通过从insert
返回指针的新值,可以避免这种额外的间接级别,如下所示:
NODE* insert(NODE*root, int value) {
...
root->left = insert(root->left, value);
...
}
但是,这会改变所有呼叫者必须呼叫insert
的方式,包括顶级呼叫者:而不是写作
insert(&root, value);
他会被迫写作
root = insert(root, value);
表达方式:
*root->left
相当于:
*(root->left)
由于运营商优先权。
所以你需要:
(*root)->left
如果你想要left
指向的*root
成员。
然后:
&(*root)->left
是指向left
的*root
成员的指针,然后是NODE **
类型,insert
函数需要什么。
&(*
不是声明。
它是&
运算符的一部分应用于表达式(*root)->left
。