एक द्विआधारी खोज वृक्ष खोज

वोट
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;

}

इसलिए मुख्य अंदर कोड के इस बिट () है, जहां यह नहीं मिला कहते हैं जब मुझे लगता है कि यह सही ढंग से काम किया जाना चाहिए। दोनों नाम और 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

मुझे पता नहीं सी ++ विशेषज्ञ हूँ, लेकिन अपने == ऑपरेटर वास्तव में मूल्यांकन किया जा रहा है? यह दो स्थिरांक डेटा संदर्भ लेने के लिए होती है, लेकिन आप की तुलना किए जाने की जो भी प्रकार दिखाई देते हैं 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++)

कि इसके अलावा, यह भी अपने कार्य लगता है सही या कुछ अनिर्धारित बूलियन देता है। आप शायद एक होना चाहिए return false;BST के अंत में :: पुनः प्राप्त।

05/12/2009 को 21:58
का स्रोत उपयोगकर्ता

वोट
1

अपने सरणी में प्रत्येक आइटम के ऊपर पाशन नहीं, जैसे अन्य लोगों ने कहा - आप पेड़ के माध्यम से नेविगेट करने के लिए BST का उपयोग कर किया जाना चाहिए। की तरह कुछ का प्रयास करें:

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