2016-12-10 1 views
0

Je pourrais utiliser de l'aide. J'ai essayé d'obtenir ma fonction de suppression pour fonctionner correctement, mais peu importe ce que je semble faire, il me donne toujours une erreur "was nullptr". Mon code est un peu brouillon depuis que je panique et que j'essaie frénétiquement tout ce qui me vient à l'esprit. Je suis prêt à recommencer si j'ai besoin de le faire. Partout où j'ai cherché des informations sur nullptr n'a pas vraiment donné une explication que je comprends réellement. Ma compréhension est qu'une erreur "was nullptr" est donnée lorsque vous essayez de déréférencer un pointeur/noeud, mais je ne pourrais jamais trouver un moyen de gérer le problème qui me semblait logique. Toute aide est vraiment appréciée. Mon code est:Qu'est-ce que "Read Access Violation ... was 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

Le code ne à plusieurs reprises des choses comme « parent-> gauche = parent-> left-> left; ", sans vérifier si" parent-> left "est NULL. C'est la cause probable de vos plantages. –

+1

Vous devriez vraiment mettre votre programme dans un débogueur et vérifier où le problème est et se prémunir contre. –

Répondre

0

Chaque fois que vous avez du code comme ceci:

parent = parent->right; 

vous devez vérifier que la valeur que vous avez nouvellement attribué à la société mère est non nul. En d'autres termes, votre code doit ressembler à ceci:

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

changé pour

while (parent != NULL) 

et il devrait fonctionner