zoek een binaire zoekboom

stemmen
0

Ik ben op zoek naar een naam binnen een sleutel te vinden. Ik denk dat het is prima ophalen. Maar zijn komst als niet gevonden. misschien mijn code is verkeerd ergens?

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

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

halen functie ...

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
        }


    }

}


 }

en gedefinieerd data.cpp

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

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

}

dus dit stukje code in main () is waar het niet zegt gevonden als ik denk dat het moet behoren werkt. zowel de naam als ADATA bevatten de juiste naam die werd gevonden ..

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;
     }
De vraag is gesteld op 05/12/2009 om 19:54
bron van user
In andere talen...                            


3 antwoorden

stemmen
0

Ik ben geen C ++ expert, maar is uw == operator daadwerkelijk wordt geëvalueerd? Het is bedoeld om twee const gegevens referenties, maar je lijken te vergelijken, ongeacht het type items[index].instanceDatais en een char*.

Ik stel voor dat je een aantal logging gezet in de operator en zien of het daadwerkelijk wordt genoemd - ik vermoed dat is het niet.

Een optie om de == operator te nemen uit de vergelijking zou tijdelijk zijn om de vergelijking expliciet te maken:

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

Op een ander punt, kan ik niet zien hoe dit ook daadwerkelijk doet een binary search at all. Het lijkt mij alsof het enkel een duidelijke lijst - je doet een lineair zoeken in retrieveplaats van het vergelijken van de sleutel en naar links of naar rechts uit de boom (of returning "gevonden"), afhankelijk van het resultaat.

antwoordde op 05/12/2009 om 20:03
bron van user

stemmen
0

Ik kan niet met zekerheid zeggen zonder het zien van de code voor BST, maar dit ziet er niet verkeerd:

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

Met de traditionele conventies, zou het moeten zijn:

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

Daarnaast is, lijkt het ook uw functie ofwel geeft true of een ongedefinieerde boolean. Je moet waarschijnlijk een return false;aan het eind van BST :: halen.

antwoordde op 05/12/2009 om 21:58
bron van user

stemmen
1

Je moet in het gebruik van de BST om te navigeren door de boom - niet looping op elk item in de array, zoals anderen al hebben gezegd. Probeer iets als:

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)

Dat moet goed werken! :)

antwoordde op 05/12/2009 om 23:32
bron van user

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