2016-12-28 13 views
0

Ich habe eine Aufgabe, die AVL-Bäume und Rangbäume umfasst. In dieser spezifischen Zuweisung müssen wir einen Rank AVL-Tree implementieren, der Knoten eine andere Information enthält.

Ich habe dieses Problem:
Ich machte einen AVL-Baum und für den Rank-Baum wählte ich die Vererbung.
In der Funktion "Einfügen" des Rank-Baums rufe ich eine andere Funktion namens "setAllHeights" auf, die einen Knoten als Argument erhält.
Wenn ich jedoch die Werte im Debugger des Arguments sehe, sehe ich, dass die Funktion NULL-Zeiger empfängt.
Ich verstehe nicht warum, denn bevor ich die "setAllHeights" -Funktion eingegeben habe, habe ich den Wert des Arguments überprüft und es war definitiv nicht NULL.
Was könnte das Problem sein, und warum passiert es?

Ich werde Ihre Hilfe sehr schätzen.C++ - Zeiger verliert nach Funktionsaufruf Wert in der Vererbung.


Der Code der Funktion Einfügen:

template<class T, class Compare> 
bool RAVL<T, Compare>::insert(const T& data) { 
    if (root == NULL) { 
     root = new (nothrow) RNode<T, Compare>(data, NULL); 
     if (!root) 
      throw AllocationError(); 
     size++; 
     return true; 
    } 
    Compare cmp; 
    RNode<T, Compare> *v; 
    if (find(data, &v)) 
     return false; 
    if (cmp(v->data, data)) { 
     v->right = new (nothrow) RNode<T, Compare>(data, v); 
     if (!v->right) 
      throw AllocationError(); 
    } else { 
     v->left = new (nothrow) RNode<T, Compare>(data, v); 
     if (!v->left) 
      throw AllocationError(); 
    } 
    Node<T,Compare> * n=v; 
    AVL<T,Compare>::setAllHeights(n); 
    rebalance(v); 
    size++; 
    return true; 
} 


Der Code der setAllHeights Funktion:

template<class T, class Compare> 
void AVL<T, Compare>::setAllHeights(Node<T, Compare> *n) { 
    if (n == NULL) { 
     return; 
    } 
    setHeight(n); 
    setAllHeights(n->parent); 
} 
+0

Das richtige Werkzeug, um solche Probleme zu lösen, ist Ihr Debugger. Sie sollten Schritt für Schritt durch Ihren Code * gehen, bevor Sie auf Stack Overflow nachfragen. Für weitere Hilfe lesen Sie bitte [Wie kleine Programme zu debuggen (von Eric Lippert)] (https://ericlippert.com/2014/03/05/how-to-debug-small-programs/). Zumindest sollten Sie Ihre Frage bearbeiten, um ein [minimales, vollständiges und verifizierbares] (http://stackoverflow.com/help/mcve) Beispiel einzufügen, das Ihr Problem zusammen mit den Beobachtungen, die Sie in der Debugger. –

+0

Dies ist genau das, was ich gemacht habe .. Ich sah im Debugger, dass die Funktion NULL-Zeiger empfängt .. Ich verstehe einfach nicht, warum es passiert. – kidneyThief

+0

Machst du einen Debug-Build? Sie können manchmal seltsame Dinge in optimierten Builds sehen. –

Antwort

1

Es scheint mir, dass Sie nicht v initialisiert werden, und wenn Sie es also n zuweisen, wird das auch nicht initialisiert. Sie müssten v = new RNode (...) oder was auch immer Ihre Logik ist.

+0

Ich initialisiere v durch die Funktion "find". Es findet mich den Knoten, den ich einfügen muss. Die Funktion funktioniert. Ich möchte nur wissen, warum die Funktion NULL-Zeiger empfängt, wenn es im Debugger nicht wirklich NULL ist. – kidneyThief

+0

@kidneyThief ** [MCVE] ** in Ihrer Frage !!!! –

+0

Ich werde es versuchen. Vielen Dank. – kidneyThief

Verwandte Themen