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

ポインタはその値を「失う」わけではありません。ノードへのポインタへのポインタを渡す必要がありますinsert-そうすれば、パラメータを介してノードへのポインタを「返す」ことができます。

于 2012-08-17T04:58:25.160 に答える
2

値を渡すrootため、呼び出し先が変更することはできません。参照によって渡す必要があります。

void insert(node** _node,int val);
insert (&root,input);
于 2012-08-17T04:59:37.287 に答える
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それでもゼロになります。

ポインタでも違いはありません。関数内のポインター自体を変更する場合は、ポインターをポインターとして渡す(および関数内で逆参照する)か、参照型として渡す必要があります。

于 2012-08-17T04:59:56.783 に答える
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)すると、呼び出し後にinfoo(int& x)の値が42 になります。kbar

C++ を使用している場合、&文字は、パラメーターを値ではなく参照で渡す必要があることをコンパイラーに伝えnodeます (つまり、ポインターのコピーを作成したくないが、関数は変数を直接操作する必要があります)。

byvalVisual Basic を使用している場合は、別段の指示がない限り、すべてのパラメーターが C および C++ であることを覚えておいてください(他のほとんどの最新言語でも同じことが起こります)。

実際、C や他のほとんどの現代言語では、パラメーターを参照渡しする方法はまったくありません。

于 2012-08-17T05:31:29.663 に答える
0

ここでのすべての回答に加えて、関数が削除されることのないメモリを割り当てpointers to pointersていることを指摘したいと思います。insert

allocationsと の両方を処理するシステムを設計する必要がありdeallocationsます。

于 2012-08-17T05:01:37.777 に答える