αναζητήσετε ένα δυαδικό δέντρο αναζήτησης

ψήφοι
0

Είμαι προσπαθεί να βρει ένα όνομα σε ένα κλειδί. Νομίζω ότι είναι αυτό ανάκτηση πρόστιμο. Ωστόσο, του έρχονται ως δεν βρέθηκε. ίσως κωδικός μου είναι λάθος κάπου;

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

σε 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);

ανακτήσετε τη λειτουργία ...

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
        }


    }

}


 }

και ορίζεται στο data.cpp

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

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

}

έτσι ώστε αυτό το κομμάτι του κώδικα μέσα στο main () είναι που δεν λέει βρεθεί πότε εγώ πιστεύω ότι πρέπει να λειτουργούν σωστά. τόσο το όνομα και ADATA περιέχει το σωστό όνομα που βρέθηκε ..

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;
     }
Δημοσιεύθηκε 05/12/2009 στις 19:54
πηγή χρήστη
Σε άλλες γλώσσες...                            


3 απαντήσεις

ψήφοι
0

Δεν είμαι ειδικός C ++, αλλά είναι χειριστή == σας πραγματικότητα που αξιολογείται; Είναι γραφτό να πάρει δύο const αναφορές δεδομένων, αλλά φαίνεται να συγκρίνει ό, τι ο τύπος της items[index].instanceDataείναι και ένα char*.

Σας προτείνω να βάλετε κάποια καταγραφή στο χειριστή και να δούμε αν αυτό είναι πραγματικά που ονομάζεται - υποψιάζομαι ότι δεν είναι.

Μια επιλογή για να πάρει το χειριστή == έξω από την εξίσωση προσωρινά θα ήταν να γίνει η σύγκριση ρητή:

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

Σε άλλο σημείο, δεν μπορώ να δω πώς αυτό είναι πραγματικά κάνει μια δυαδική αναζήτηση σε όλα. Μου φαίνεται σαν να είναι μόνο μια απλή λίστα - κάνετε μια γραμμική αναζήτηση μέσα retrieveαντί να συγκρίνει το κλειδί και πηγαίνει αριστερά ή προς τα δεξιά κάτω από το δέντρο (ή επιστροφή του «βρέθηκε») ανάλογα με το αποτέλεσμα.

Απαντήθηκε 05/12/2009 στις 20:03
πηγή χρήστη

ψήφοι
0

Δεν μπορώ να πω με βεβαιότητα χωρίς να δει τον κώδικα για BST, αλλά αυτό φαίνεται λάθος:

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

Με τις παραδοσιακές συμβάσεις, θα πρέπει να είναι:

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

Εκτός από αυτό, φαίνεται, επίσης, τη λειτουργία σας, είτε επιστρέφει true ή κάποια απροσδιόριστη boolean. Θα πρέπει να έχετε κατά πάσα πιθανότητα return false;στο τέλος της BST :: ανακτήσετε.

Απαντήθηκε 05/12/2009 στις 21:58
πηγή χρήστη

ψήφοι
1

Θα πρέπει να χρησιμοποιείτε το BST για να περιηγηθείτε μέσα από το δέντρο - δεν looping πάνω από κάθε στοιχείο στη σειρά σας, όπως είπαν και άλλοι. Δοκιμάστε κάτι σαν:

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)

Αυτό θα πρέπει να λειτουργεί καλά! :)

Απαντήθηκε 05/12/2009 στις 23:32
πηγή χρήστη

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