2016-12-10 16 views
0

Ich könnte Hilfe gebrauchen. Ich habe versucht, meine Löschfunktion korrekt zu funktionieren, aber egal was ich zu tun scheint, gibt es mir immer einen Fehler "war nullptr". Mein Code ist ein bisschen unordentlich, seit ich in Panik geraten bin und verzweifelt versuche, alles, was mir in den Sinn kommt. Ich bin bereit, neu anzufangen, wenn ich es brauche. Überall, wo ich nach Informationen über nullptr gesucht habe, habe ich nicht wirklich eine Erklärung gegeben, die ich eigentlich verstehe. Mein Verständnis ist, dass ein Fehler "war nullptr" gegeben wurde, wenn Sie versuchen, einen Zeiger/Knoten zu dereferenzieren, aber ich konnte nie einen Weg finden, um das Problem zu behandeln, das für mich sinnvoll war. Jede Hilfe wird wirklich geschätzt. Mein Code ist:Was ist "Lesezugriffsverletzung ... war nullptr"?

` 

BT::BT() 
{ 
    node* root = NULL; 
} 

char BT::FindReplacement(node* parent, char param) 
{ 
    if (parent == NULL) //In case someone tries to delete a node while there aren't any nodes in the Tree 
    { 
     return NULL; 
    } 

    parent = parent->right; 
    while (parent->left != NULL) 
    { 
     parent = parent->left; 
    } 

    return parent->data; 
} 

void BT::leafDriver() 
{ 
    int count = 0; 
    leafCount(root, count); 
} 

void BT::leafCount(node* start, int count) 
{ 


    if ((start->left == NULL) && (start->right == NULL)) 
    { 
     count++; 
    } 

    if (start->left != NULL) 
    { 
     leafCount(start->left, count); 
    } 

    if(start->right != NULL) 
    { 
     leafCount(start->right, count); 
    } 
cout << " There are " << count << " number of leaves in the BST" << endl; 

} 


void BT::deletionDriver(char param) 
{ 
    deletion(root, param); 
} 

void BT::deletion(node* parent, char param) 
{ 

    if (parent->data < param) 
    { 
     parent->left = parent->left->left; 
     deletion(parent -> left, param); 
     cout << "checking left node" << endl; 
    } 

    else if (parent->data > param) 
    { 
     parent->right = parent->right->right; 
     deletion(parent->right, param); 
     cout << "checking right node" << endl; 
    } 

    else if (parent->data == param) 
    { 
     //Case 1: No Children 
     if (parent->left == NULL && parent->right == NULL) 
     { 
      delete parent; 
      parent = NULL; 

     } 


     //Case 2: One Child 
     else if ((parent->right == NULL) && (parent->left != NULL)) 
     { 
      node* temp = parent; 
      parent = parent->left; 
      delete temp; 
     } 

     else if (parent->left == NULL) 
     { 
      node* temp = parent; 
      parent - parent->right; 
      delete temp; 
     } 

     //Case 3: Two Children 
     else if ((parent->left != NULL) && (parent->right != NULL)) 
     { 
      char tempParam; 
      tempParam = FindReplacement(parent, param); 
      parent->data = tempParam; 
      deletion(parent->right, tempParam); 
     } 
    } 

    else 
     cout << "Item is not found in BST" << endl; 
}` 
+4

Der Code funktioniert wiederholt sich Sachen wie „Eltern-> links = parent -> left -> left; ", ohne zu prüfen, ob" parent -> left "gleich NULL ist. Dies ist die wahrscheinliche Ursache für Ihre Abstürze. –

+1

Sie sollten Ihr Programm wirklich in einen Debugger stellen und überprüfen, wo das Problem ist und sich davor schützen. –

Antwort

0

Jedes Mal, wenn Sie Code wie dieses:

parent = parent->right; 

Sie müssen prüfen, ob der Wert, den Sie neu zu Eltern zugewiesen haben nicht null ist. Mit anderen Worten sollte der Code immer so etwas wie folgt aussehen:

parent = parent->right; 
if (parent == nullptr) { 
    // handle null case 
} 
else { 
    // handle case when there is another node 
} 
0
while (parent->left != NULL) 

verändert es

while (parent != NULL) 

und es sollte

Verwandte Themen