嗨大家我有一个问题根值是每次我从插入函数出来时返回NULL我真的不明白为什么指针不能保持它的值。
int main(int argc, char *argv[])
{
int input;
node* root = NULL;
while (input >0 ) {
cout<< "Enter a Number:";
cin>> input;
insert (root,input);
}
printall(root);
system("PAUSE");
return 0;
}
void insert(node* _node,int val)
{
//#if 0
cout << "In insert before" << _node;
if (_node == NULL) {
_node = new node;
_node->val = val;
_node->left = NULL;
_node->right = NULL;
return;
}
//#endif
if(_node->val > val) {
insert(_node->left,val);
} else if (_node->val < val) {
insert(_node->right,val);
}
return;
}
答案 0 :(得分:2)
指针不会“失去”它的值。您需要将指向节点的指针传递给insert
- 然后它可以通过参数“返回”指向节点的指针。
答案 1 :(得分:2)
您按值root
传递,因此被调用者无法修改,您必须通过引用传递
void insert(node** _node,int val);
insert (&root,input);
答案 2 :(得分:1)
如果要更改函数中的root
指针(或任何指针),则需要传递指向该指针的指针(如果您使用的是C ++,则更可能是引用,我是很确定你是因为你正在使用new
)。类似的东西:
void fn (node **pRoot) {
*pRoot = new node;
}
C和C ++都是默认的传值,因此更改不会回显到更高的级别。
请考虑以下代码:
void changeVals (int x, int *py, int &z) {
x = 1;
*py = 2;
z = 3;
}
int X = 0;
int Y = 0;
int Z = 0;
changeVals (X, &Y, Z);
此时,Y
和Z
都会发生变化,但X
仍为零。
与指针没什么不同。如果要在函数中更改指针本身,则必须将其作为指针传递给它(并在函数中取消引用)或作为引用类型。
答案 3 :(得分:1)
简短回答:您使用的是C ++而忘记输入字符或键盘有缺陷...正确的代码是
void insert(node *& _node, int value) // note '&'
{
...
}
答案很长:
通常C和C ++函数参数是“按值”,这意味着被调用的函数将接收你传递它们的副本 ...
void foo(int x)
{
x = 42;
}
void bar()
{
int k = 12;
foo(k);
// Here k is still 12, not 42
}
然而, C ++具有“引用”的概念,允许您在不进行复制的情况下传递参数,然后该函数可以更改调用者变量。将foo(int x)
更改为foo(int& x)
,通话后k
中bar
的值将变为42。
如果你正在使用C ++,&
字符告诉编译器node
参数应该通过引用而不是值传递(即你不想复制一个指针,但该函数应该直接与您的变量一起使用。
如果您来自Visual Basic,那么请记住C和C ++中的所有参数都是byval
,除非另有说明(大多数其他现代语言也是如此)。
实际上在C和大多数其他现代语言中,根本没有办法通过引用传递参数。
答案 4 :(得分:0)
除了这里有关pointers to pointers
的所有答案之外,我想指出你的insert
函数正在分配永不删除的内存。
您需要设计同时处理allocations
和deallocations
的系统。