2013-04-05 6 views
0

J'écris un programme qui lit dans un "dossier d'étudiant" si vous voulez, puis le sépare en 4 arbres de recherche binaires basés sur les données. J'essaye de supprimer un noeud, mais au lieu de le supprimer, je voudrais simplement mettre un drapeau dans la structure, ce qui me permet de savoir qu'il a été "supprimé". Ceci est mon code et il me donne plusieurs erreurs:Arbre de recherche binaire, supprimer le noeud

void deleteNode(TreeNodePtr *treePtr, SREC R, unsigned long key)/*ADD HOW*/ 
{ 
    printf("I got into the delete function.\n"); 

    /*empty*/ 
    if(*treePtr != NULL) 
    { 
     if(R.SID<(*treePtr)->SID)/*Not empty*/ 
     { 
      printf("less than\n"); 
      deleteNode((*treePtr)->leftPtr, R, key); 
     } 
     else if(R.SID>(*treePtr)->SID) 
     { 
      printf("more than.\n"); 
      deleteNode((*treePtr)->rightPtr, R, key); 
     } 
     else 
     { 
      treePtr->exists = 1; 
      printf("Are we deleted yet?\n"); 
     } 
    } 
    else 
    { 
     fprintf(stderr,"Could not locate student with ID.\n"); 
    } 
} 

Les erreurs sont: Note: attendu 'struct treeNode **', mais l'argument est de type 'struct treeNode *' erreur: 'treeNode struct' n'a aucun membre nommé 'SID'. Je suis sûr que je manque juste une petite chose mais je ne sais pas ce que c'est. Des idées?

+1

Et vos définitions de structure sont: –

+1

Quel est le point de 'key'? – jxh

+1

Également nous montrer la définition pour les types 'TreeNodePtr' et' SREC'. –

Répondre

1

changement

deleteNode((*treePtr)->leftPtr, R, key); 

dans

deleteNode(&(*treePtr)->leftPtr, R, key); 

même pour la droite. Il est discutable si vous voulez vraiment que la fonction prenne un ** cependant. un * fonctionnerait aussi bien lorsque vous ne supprimez pas réellement. Pour la deuxième erreur, vous avez très probablement un membre struct treeNode de type SREC. Vous devez infixe le nom de ce membre, par ex. (*treePtr)->R.SID.

+0

Et comment 'treePtr-> exists = 1;' supposé fonctionner? L'OP est confus au sujet des pointeurs par rapport aux pointeurs vers les pointeurs, et doit apprendre à nommer les choses correctement et à utiliser des variables temporaires pour éviter le code illisible et trop cher dispersé avec double derefs. –

0

The errors are : note: expected ‘struct treeNode **’ but argument is of type ‘struct treeNode *’ error: ‘struct treeNode’ has no member named ‘SID’

Ces erreurs signifient exactement ce qu'elles disent. Le premier paramètre de deleteNode est de type TreeNodePtr *, alias struct treeNode **, mais vous passez (*treePtr)->leftPtr, qui est de type TreeNodePtr, alias struct treeNode *. Et vous référencez (* treePtr) -> SID mais il n'y a aucun tel membre de struct treeNode.

Vous devriez également obtenir une erreur pour

treePtr->exists = 1; 

parce que les points treePtr à un pointeur à un struct treeNode, mais les pointeurs n'ont pas membres. Et pourquoi votre drapeau "supprimé" s'appelle "existe"? C'est en arrière. Soit l'appeler deleted, ou le mettre à 0 et l'initialiser à 1. Le premier est meilleur.

Et à quoi sert votre paramètre key? Vous ne l'utilisez jamais.

Voici quelque chose qui pourrait fonctionner, en supposant que TreeNode contient un SREC appelé R, et un drapeau deleted:

void markDeleted(TreeNode* pnode, SREC R) 
{ 
    if (pnode == NULL) 
    { 
     fprintf(stderr,"Could not locate student with ID.\n"); 
    } 
    else if (R.SID < pnode->R.SID) 
    { 
     /* search left branch */ 
     markDeleted(pnode->leftPtr, R); 
    } 
    else if (R.SID > pnode->R.SID) 
    { 
     /* search right branch */ 
     markDeleted(pnode->rightPtr, R); 
    } 
    else 
    { 
     /* match */ 
     pnode->deleted = 1; 
    } 
} 
Questions connexes