我试图用C ++实现BST,所以我尝试了这个:
#include <iostream>
#include <stdlib.h>
struct node
{
int value;
node* left;
node* right;
};
void insert(node *cur , int val)
{
if(!cur)
{
cur = new node;
cur->value = val;
cur->left = NULL;
cur->right = NULL;
return;
}
if(val <= cur->value)
insert(cur->left , val);
else
insert(cur->right , val);
}
using namespace std;
int main()
{
node *root = NULL;
insert(root , 20);
insert(root , 21);
cout<<(*root).value;
return 0;
}
但我遇到了问题,我的insert()
功能效果很好,但cur
中的更改似乎没有反映在root
指针中,因为root
仍然存在{在`insert()函数调用之后{1}}。这有什么不对?
答案 0 :(得分:1)
此处,root
本身已使用pass-by-value传递给insert()
。因此,从insert()
开始,root
的值无法更改。换句话说,cur
是insert()
函数的本地。对cur
本身所做的任何更改都不会影响实际传递的参数。
如果您想从root
更改insert()
的值,则需要将指针从root
传递给main()
。
要详细说明,您可以更改cur
中insert()
指向的地址处的值。所以,按照同样的比喻,如果你改变
insert(&root , 20);
void insert(node **cur , int val)
cur
到*cur
你应该好好去。
答案 1 :(得分:0)
错误的是您按值传递指针,更改该值但调用者不知道它。将其更改为
void insert(node **cur , int val)
{
if(!*cur)
{
*cur = new node;
(*cur)->value = val;
(*cur)->left = NULL;
(*cur)->right = NULL;
return;
}
if(val <= (*cur)->value)
insert((*cur)->left , val);
else
insert((*cur)->right , val);
}
相应地更改函数调用(...运动!)
答案 2 :(得分:0)
C ++使函数调用成为Call by Value。所以它制作指针的副本并将其传递给函数。如果传递该指针,则可以访问指针指向的数据,但不能访问函数本身外部的指针,因为只复制指针所指向的地址。
如果你想修改指针本身(可能是C尝试)或通过引用传递,你需要传递一个指向指针的指针,这是c ++能够实现的。
如果您想使用C尝试:
void insert(node ** cur , int val)
if(!(*cur))
{
(*cur) = new node;
(*cur)->value = val;
(*cur)->left = NULL;
(*cur)->right = NULL;
return;
}
或C ++尝试(这里你只需要修改cur的类型,其他的将保持不变):
void insert(node *& cur , int val)
答案 3 :(得分:0)
如果将cur重新分配给insert中的新节点,那并不意味着为root赋予了该值(特别是root根本不是地址,而是NULL)。
将指针传递给空节点以在初始化时插入(并使用相关数据更新)或返回新节点(并将其分配给main中的root)。
答案 4 :(得分:0)
如果您希望该功能在外部指针而不是本地副本上运行,则需要通过引用传递:
void insert(node*& cur, int val)
{
// ...
}
否则该函数适用于指针的副本,外部变量保持不变。