2017-02-22 5 views
0

私はバイナリ検索ツリー機能に取り組んでいます。なぜノードポインタの前に&記号を追加する必要がありますか?私はそれが既にポインタであり、すでにある場所を指していると思った。私は、ノードを追加すると、親ノードが新しいノードを指していることを確認する必要があります。そうでない場合、親ノードは引き続きNULLを指しています。しかし、ノード・ポインタをノード* &として渡すと、私はそれをしなければならないのですか?バイナリ検索ツリー。参照パラメータとしてのポインタ

bool bst::remove123(int data, node*& x) 
{ 
if (x == NULL) 
{ 
    return false; 
} 
else if (x->getData() < data) 
{ 
    return remove123(data, x->right); 
} 
else if (x->getData() > data) 
{ 
    return remove123(data, x->left); 
} 
else 
{ 
    node* old = x; 
    if (x->left == NULL) 
    { 
     x = x->right; 
    } 
    else if (x->right == NULL) 
    { 
     x = x->left; 
    } 
    else 
    { 
     replacement(old, x->left); 
    } 
    delete old; 
    return true; 
} 
} 

+0

ここでは、 '&'はアドレス演算子ではありません。参照宣言です。あなたは戻って、あなたのC++の本でポインターとリファレンスの説明を読み返す必要があります。パラメータが参照である必要がある理由は、ノードが削除されたときに、削除されるノードへの元のポインタを置き換える必要があり、この再帰コンテキストで最も簡単な方法は、参照を使用することです。参照の詳細については、C++の本を参照してください。 –

+0

'T *'型のポインタを変更する必要があるときは、ポインタ型 'T *&'への参照を渡します。ポインタ型への参照は他の型への参照と同じです。 –

答えて

0

node*& xnode*への参照です、ありがとうございました。つまり、bst::remove123xを別のアドレスを指すように変更すると、bst::remove123というコードでは、メソッドに渡された変数node*に同じ変更が反映されます。 xパラメータをnode *xとして宣言した場合、bst::remove123は、そのパラメータで渡された変数のコピーを変更するだけで、メソッドが返された後に変更が失われます。参照を指定するのに&が使用されていますが、これは後に続く変数のアドレスを返す&演算子(ポインタでよく使用される)とはまったく異なります。

int n = 10; 
int *pn = &n; // Create a pointer to int, set it to the address of n. 
int& rn = n; // Create an int reference, set it to reference the same variable as n. 

*pn = 5; // Set n to 5 via a dereferenced pn. A dereferencing operator * 
     // is needed to indicate that we want to change the memory that 
     // pn points to, not the address that the pointer contains. 

rn = 20; // Set n to 20 via the reference rn. Unlike with pointers, 
     // references do not use a dereferencing operator. 
関連する問題