3

每次我从插入函数中退出时,根值都会返回 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;        
}
4

5 回答 5

2

您正在root按值传递,因此被调用者无法修改它,您必须通过引用传递它

void insert(node** _node,int val);
insert (&root,input);
于 2012-08-17T04:59:37.287 回答
2

指针并没有“失去”它的价值。您需要将指向节点的指针传递给insert-- 然后它可以通过参数“返回”指向节点的指针。

于 2012-08-17T04:58:25.160 回答
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)kin的值bar将变为 42。

如果您使用 C++,该&字符会告诉编译器node参数应该通过引用而不是值传递(即您不想复制指针,但函数应该直接使用您的变量。

如果您来自 Visual Basic,那么请记住所有参数都byval在 C 和 C++ 中,除非另有说明(在大多数其他现代语言中也是如此)。

实际上,在 C 和大多数其他现代语言中,根本没有办法通过引用传递参数。

于 2012-08-17T05:31:29.663 回答
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);

此时,两者YZ都将发生变化,但X仍为零。

这与指针没有什么不同。如果要在函数中更改指针本身,则必须将其作为指向它的指针(并在函数中取消引用)或作为引用类型传递。

于 2012-08-17T04:59:56.783 回答
0

除了pointers to pointers这里的所有答案之外,我想指出您的insert函数正在分配永远不会被删除的内存。

您需要设计同时处理allocations和的系统deallocations

于 2012-08-17T05:01:37.777 回答