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()内のこのコードは、正しく機能するはずだと思ったときに見つからないと表示されます。nameと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;
     }
4

3 に答える 3

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)

それはうまくいくはずです!:)

于 2009-12-05T22:32:09.057 に答える
0

私はC++の専門家ではありませんが、あなたの==演算子は実際に評価されていますか?これは、2つのconstデータ参照を取得することを目的としていますが、タイプが何であれ、とを比較しているように見えitems[index].instanceDataますchar*

オペレーターにログインして、実際に呼び出されているかどうかを確認することをお勧めします。そうではないと思います。

==演算子を一時的に方程式から除外する1つのオプションは、比較を明示的にすることです。

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

別の点では、これが実際にどのように二分探索を行っているのかまったくわかりません。単なるリストのように見えます。retrieveキーを比較して、結果に応じてツリーを左または右に下る(または「見つかった」を返す)のではなく、内部で線形検索を実行しています。

于 2009-12-05T19:03:49.980 に答える
0

BSTのコードを見ないとはっきりとはわかりませんが、これは間違っているように見えます。

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

従来の規則では、次のようになります。

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

それに加えて、関数がtrueまたは未定義のブール値を返すようにも見えます。return false;おそらく、BST::retrieveの最後にが必要です。

于 2009-12-05T20:58:54.957 に答える