题
我试图在钥匙中找到一个名字。我认为它检索得很好。然而,它的出现却没有找到。也许我的代码在某个地方是错误的?
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;
}
解决方案
您应该使用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)
这应该很好地工作! :)
其他提示
我不是 C++ 专家,但是您的 == 运算符实际上正在被评估吗?它意味着采用两个 const 数据引用,但您似乎正在比较任何类型 items[index].instanceData
是和一个 char*
.
我建议你在操作员中进行一些登录,看看它是否真的被调用 - 我怀疑它没有被调用。
暂时将 == 运算符排除在等式之外的一种选择是使比较显式化:
if (strcmp(items[index].instanceData.getName(), key) == 0)
{
...
}
另一方面,我根本看不出这实际上是如何进行二分搜索的。在我看来,这只是一个简单的列表 - 你正在其中进行线性搜索 retrieve
而不是比较密钥并根据结果向左或向右走树(或返回“找到”)。
我不能肯定地告诉没有看到对BST的代码,但是这看起来错了:
for(int index=0; index < maxsize+1; index++)
与传统的惯例,它应该是:
for(int index=0; index < maxsize; index++)
在那旁边,似乎也是你的函数或者返回true或者一些不确定的布尔值。你或许应该有一个return false;
在BST结束::恢复。
不隶属于 StackOverflow