2009-12-05 5 views
0

J'essaie de trouver un nom dans une clé. Je pense qu'il récupère bien. Cependant, son coming up comme non trouvé. peut-être que mon code est faux quelque part?rechercher un arbre de recherche binaire

if (database.retrieve(name, aData)) // both contain the match 

dans main()

static void retrieveItem(char *name, data& aData) 
{ 
cout << ">>> retrieve " << name << endl << endl; 
if (database.retrieve(name, aData))   // name and aData both contain the match 
    cout << aData << endl; 
else 
    cout << "not found\n"; 
cout << endl; 
    } 

    static void removeItem(char *name) 
    { 
cout << ">>> remove " << name << endl << endl; 
if (database.remove(name)) 
    cout << name << " removed\n"; 
else 
    cout << name << " not found\n"; 
cout << endl; 
    } 

    int main() 
    { 
    #ifdef _WIN32 
// request memory leak report in Output Window after main returns 
_CrtSetDbgFlag (_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); 
    #endif 

data aData; 


    << "Database Of Great Computer Scientists\n\n"; 

database.insert(data("Ralston, Anthony")); 
database.insert(data("Liang, Li")); 
database.insert(data("Jones, Doug")); 
database.insert(data("Goble, Colin")); 
database.insert(data("Knuth, Donald")); 
database.insert(data("Kay, Alan")); 
database.insert(data("Von Neumann, John")); 
database.insert(data("Trigoboff, Michael")); 
database.insert(data("Turing, Alan")); 
displayDatabase(true); 
retrieveItem("Trigoboff, Michael", aData); 
retrieveItem("Kaye, Danny", aData); 

removeItem("Ralston, Anthony"); 
displayDatabase(true); 

récupérer la fonction ...

bool BST::retrieve(const char *key, data &aData, int parent) const 
{ 

for(int index=0; index < maxsize+1; index++) 
{ 

    if (!items[index].empty) 
    { 


     if (items[index].instanceData == key) 
     { 
      aData.setName(key); 
      return true;     // doesn't return right away 
     } 


    } 

} 


} 

et défini dans data.cpp

bool operator== (const data& d1, const data& d2) 
{ 

return strcmp(d1.getName(), d2.getName()) == 0; 

} 

si ce bit de code à l'intérieur main() est où il dit pas trouvé quand je l'encre devrait fonctionner correctement. le nom et aData contiennent le bon nom qui a été trouvé ..

static void retrieveItem(char *name, data& aData) 
{ 
cout << ">>> retrieve " << name << endl << endl; 
if (database.retrieve(name, aData))   // name and aData both contain the match 
    cout << aData << endl; 
else 
    cout << "not found\n"; 
cout << endl; 
    } 
+0

Quelque chose ne va pas avec toutes vos modifications (dans cette question et d'autres). D'abord, vous posez des questions détaillées avec le code, puis obtenez des réponses et discutez-en, puis supprimez tout le contenu sauf une demi-phrase. Cela rend la question insignifiante à moins que les lecteurs annulent vos modifications. S'il vous plaît laissez suffisamment de matériel pour que les nouveaux lecteurs puissent comprendre ce qui se passe! –

+0

tag de devoirs? Vous n'avez pas tendance à voir une «base de données de grands informaticiens» en dehors de ce contexte. –

Répondre

1

Vous devriez utiliser le BST pour naviguer dans l'arbre - ne pas boucler sur chaque élément de votre tableau, comme d'autres l'ont dit. Essayez quelque chose comme:

bool retrieve(key, aData) 
    retrieve(key, aData, parent) 
    if (key == aData) 
    return true 
    else 
    return false 

bool retrieve(key, aData, parent) 
    if (key == items[parent].name) 
    aData.setName(key) 
    else if (key < items[parent].name) 
    retrieve(key, aData, 2*parent+1) 
    else 
    retrieve(key, aData, 2*parent+2) 

Cela devrait bien fonctionner! :)

0

Je ne suis pas expert C++, mais est votre opérateur == en fait en cours d'évaluation? Il est destiné à prendre deux références de données const, mais vous semblez comparer quel que soit le type de items[index].instanceData et char*.

Je vous suggère de mettre un peu de journalisation dans l'opérateur et voir si elle est effectivement appelée - je suppose que ce n'est pas le cas.

Une option de prendre l'opérateur == de l'équation serait temporairement est de faire la comparaison explicite:

if (strcmp(items[index].instanceData.getName(), key) == 0) 
{ 
    ... 
} 

Sur un autre point, je ne vois pas comment cela est en train de faire une recherche binaire à tout. Il me semble que c'est juste une liste simple - vous faites une recherche linéaire au sein de retrieve au lieu de comparer la clé et d'aller à gauche ou à droite dans l'arbre (ou retourner "trouvé") en fonction du résultat.

+0

Bien sûr, il est en cours d'évaluation. cette ligne si (éléments [index] .instanceData == clé) déclenche cette fonction. – Steller

+0

Vous dites "bien sûr" - avez-vous vérifié avec un enregistrement? Cela aiderait si vous montriez la déclaration du type "data", d'ailleurs. Étant donné que 'key' est de type' char * ', comment cela est-il contraint dans un' const data & 'pour agir comme un opérande de l'opérateur ==? –

+0

(Je suggère également que, étant donné que vous ne savez pas pourquoi votre code ne fonctionne pas, à peu près * rien * devrait être rejeté avec une réponse «bien sûr». Clairement * quelque chose * ne fonctionne pas comme prévu à ...) –

0

Je ne peux pas dire à coup sûr sans voir le code pour BST, mais cela semble mal:

for(int index=0; index < maxsize+1; index++) 

Avec les conventions traditionnelles, il devrait être:

for(int index=0; index < maxsize; index++) 

A côté de cela, il semble également que votre fonction renvoie true ou un booléen non défini. Vous devriez probablement avoir un return false; à la fin de BST :: retrieve.