căutare un arbore binar de căutare

voturi
0

Am încercat să găsească un nume într-o cheie. Cred că este bine că recuperarea. Cu toate acestea, ei venind ca nu a fost găsit. Poate codul meu este greșit undeva?

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

în 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);

funcția de a prelua ...

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
        }


    }

}


 }

și definite în data.cpp

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

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

}

astfel încât acest bit de cod interior principal () este în cazul în care nu spune găsit atunci când cred că ar trebui să funcționeze corect. atât numele și ADATA conțin numele dreapta care a fost găsit ..

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;
     }
Întrebat 05/12/2009 la 19:54
sursa de către utilizator
În alte limbi...                            


3 răspunsuri

voturi
0

Nu sunt expert ++ C, dar este operatorul == de fapt , în curs de evaluare? Este menit să ia două referințe de date const, dar par a fi comparat indiferent de tipul items[index].instanceDataeste și un char*.

Vă sugerez să pun niște logare în operator și a vedea dacă este de fapt a fi numit - Bănuiesc că nu e.

O opțiune de a lua operatorul == din ecuatie temporar ar fi de a face comparația explicită:

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

Pe un alt punct, eu nu pot vedea modul în care acest lucru este , de fapt face o căutare binară , la toate. Mie mi se pare ca este doar o listă simplu - faci o căutare liniare în retrieveloc de a compara cheia și merge la stânga sau la dreapta în jos copac (sau returnarea „găsit“) , în funcție de rezultat.

Publicat 05/12/2009 la 20:03
sursa de către utilizator

voturi
0

Nu pot spune sigur fără a vedea codul pentru BST, dar acest lucru pare greșit:

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

Cu convențiile tradiționale, ar trebui să fie:

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

Pe lângă faptul că, se pare , de asemenea , funcția , fie returnează true sau unele boolean nedefinită. Ar trebui să aveți , probabil , o return false;la sfârșitul BST :: prelua.

Publicat 05/12/2009 la 21:58
sursa de către utilizator

voturi
1

Ar trebui să fie utilizați BST pentru a naviga prin copac - nu looping peste fiecare element din matrice dvs., ca și alții au spus. Încercați ceva de genul:

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)

Acest lucru ar trebui să funcționeze bine! :)

Publicat 05/12/2009 la 23:32
sursa de către utilizator

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