2017-02-22 22 views
0

Also arbeite ich an der binären Suchbaumfunktion. Warum muss ich ein & Zeichen vor dem Knotenzeiger hinzufügen? Ich dachte, es ist bereits ein Zeiger und es zeigt bereits auf einen Ort. Ich verstehe, dass, wenn ich einen Knoten hinzufüge, ich sicherstellen muss, dass der Elternknoten auf den neuen Knoten zeigt oder der Knoten des Elternteils immer noch auf NULL zeigt. Aber warum muss ich das nicht tun, wenn ich meinen Knotenzeiger als Knoten * & übergebe?Binärer Suchbaum. Zeiger als Referenzparameter

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; 
} 
} 

Danke

+0

'&' ist hier kein Adressenoperator, es ist eine Referenzdeklaration. Sie müssen zurückgehen und die Erläuterung der Zeiger und Verweise in Ihrem C++ - Buch erneut lesen. Der Grund dafür, dass der Parameter eine Referenz sein muss, ist, dass beim Entfernen des Knotens der ursprüngliche Zeiger auf den zu entfernenden Knoten ersetzt werden muss, und der einfachste Weg dazu in diesem rekursiven Kontext besteht darin, eine Referenz zu verwenden . Weitere Informationen zu Referenzen finden Sie in Ihrem C++ - Buch. –

+0

Sie übergeben den Verweis auf einen Zeigertyp "T * &", wenn Sie den Zeiger des Typs "T *" ändern müssen. Der Verweis auf den Zeigertyp ist wie ein Verweis auf einen anderen Typ. –

Antwort

0

node*& x ist ein Verweis auf eine node*. Wenn bst::remove123x ändert, um auf eine andere Adresse zu zeigen, sieht der Code, der bst::remove123 aufgerufen hat, dieselbe Änderung in der node* Variable, die es an die Methode übergab. Wenn Sie stattdessen den x-Parameter als node *x deklarierten, würde bst::remove123 nur eine Kopie der Variablen ändern, die in diesem Parameter übergeben wurde, und diese Änderungen würden nach der Rückgabe der Methode verloren gehen. Während die & verwendet wird, um eine Referenz zu bezeichnen, ist dies sehr unterschiedlich zu dem &-Operator (häufig mit Zeigern verwendet), der die Adresse der folgenden Variablen zurückgibt.

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.