Suche ein binärer Suchbaum

stimmen
0

Ich versuche, einen Namen innerhalb eines Schlüssels zu finden. Ich denke, es ist es in Ordnung abruft. jedoch seine kommen als nicht gefunden. vielleicht mein Code irgendwo falsch?

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

im 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);

Abrufen Funktion ...

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
        }


    }

}


 }

und definiert in data.cpp

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

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

}

so dieses Stück Code in main () ist, wo sagt sie nicht gefunden, wenn ich denke, es sollte richtig funktionieren. beide Namen und ADATA enthalten den richtigen Namen, der gefunden wurde ..

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;
     }
Veröffentlicht am 05/12/2009 um 19:54
quelle vom benutzer
In anderen Sprachen...                            


3 antworten

stimmen
0

Ich bin kein C ++ Experte, aber ist Ihr Operator == tatsächlich ausgewertet? Es soll zwei const Datenreferenzen nehmen, aber Sie scheinen zu vergleichen , was die Art der items[index].instanceDataist und ein char*.

Ich schlage vor, Sie einige Protokollierung in den Bediener und sehen, ob es tatsächlich heißt wird - ich vermute, es ist nicht.

Eine Möglichkeit, den Operator == aus der Gleichung zu nehmen vorübergehend wäre der Vergleich explizit zu machen:

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

An einem anderen Punkt, kann ich nicht sehen , wie das eigentlich überhaupt eine binäre Suche zu tun. Es scheint mir , wie es nur eine einfache Liste ist - Sie innerhalb einer lineare Suche tun zu retrievevergleichen , anstatt die Schlüssel und links zu gehen oder auf dem ganzen Baum (oder „gefunden“ Rückkehr) , je nach dem Ergebnis.

Beantwortet am 05/12/2009 um 20:03
quelle vom benutzer

stimmen
0

Ich kann nicht sicher sagen, ohne den Code für BST zu sehen, aber das sieht falsch:

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

Mit den traditionellen Konventionen sollte es sein:

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

Außer , dass es scheint , auch Ihre Funktion liefert entweder wahr oder etwas undefiniert boolean. Sie sollten wahrscheinlich eine haben return false;am Ende des BST :: abgerufen werden .

Beantwortet am 05/12/2009 um 21:58
quelle vom benutzer

stimmen
1

Sie sollten die BST sein mit durch den Baum zu navigieren - nicht in Ihrem Array über jedes Element Looping, wie andere gesagt haben. Versuchen Sie so etwas wie:

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)

Das sollte gut funktionieren! :)

Beantwortet am 05/12/2009 um 23:32
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more