søke et binært søketre

stemmer
0

Jeg prøver å finne et navn innen en nøkkel. Jeg tror det er å hente det fint. Men det kommer opp som ikke funnet. kanskje min Koden er feil et sted?

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

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

hente funksjon ...

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
        }


    }

}


 }

og definert i data.cpp

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

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

}

så dette bit av koden inni main () er der den ikke sier fant da jeg tror det skal fungere helt riktig. både navn og Adata inneholde riktig navn som ble funnet ..

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;
     }
Publisert på 05/12/2009 klokken 18:54
kilden bruker
På andre språk...                            


3 svar

stemmer
0

Jeg er ingen C ++ ekspert, men er din == operatør faktisk blir evaluert? Det er ment å ta to const data referanser, men du synes å være å sammenligne uansett type items[index].instanceDataer og en char*.

Jeg foreslår at du legger litt logging til operatøren og se om det faktisk blir kalt - Jeg mistenker at det er det ikke.

Ett alternativ til å ta == operatør ut av ligningen midlertidig ville være å gjøre sammenligningen eksplisitt:

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

På et annet punkt, kan jeg ikke se hvordan dette faktisk gjør et binært søk i det hele tatt. Det ser for meg ut som det er bare en vanlig liste - du gjør en lineær søk i retrievestedet for å sammenligne nøkkelen og går til venstre eller høyre ned treet (eller retur "funnet"), avhengig av resultatet.

Svarte 05/12/2009 kl. 19:03
kilden bruker

stemmer
0

Jeg kan ikke si sikkert uten å se koden for BST, men dette ser feil:

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

Med den tradisjonelle konvensjoner, bør det være:

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

Foruten det, virker det også din funksjon enten returnerer true eller noen udefinert boolsk. Du bør nok ha en return false;på slutten av BST :: hente.

Svarte 05/12/2009 kl. 20:58
kilden bruker

stemmer
1

Du bør være å bruke BST å navigere gjennom treet - ikke looping over hvert element i matrisen, som andre har sagt. Prøv noe sånt som:

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)

Det burde fungere godt! :)

Svarte 05/12/2009 kl. 22:32
kilden bruker

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