我需要使用二进制搜索在结构数组中查找请求的名称。我使用了一个二进制搜索示例代码来搜索整数并修改它以搜索数组indecies来比较每个结构中的名称。该程序运行但名称从未找到,所以某些地方肯定会出错。不确定这是否是我从流中获取名称的方式,或者仅仅是我在搜索中的实现方式。任何人都可以看看提供一些反馈?感谢
来自输入函数的相关代码:
char entryName[31];
char discard;
string entryNameString;
cout << "What is the name of the entry you would like to look up?" << endl;
cin >> entryNameString;
cin.get(entryName, 30);
cin.get(discard);
findName(listLength, arrayOfStructs, entryName);
二进制搜索功能:
void findName(int listLength, contactInfo* arrayOfStructs, const char* entryName)
{
bool found = false;
int low = 0, high = listLength-1, mid;
while (!found && low <= high)
{
mid = (low + high) / 2;
if (strcmp(entryName, arrayOfStructs[mid].contactName) == 0)
found = true;
else
if (strcmp(entryName, arrayOfStructs[mid].contactName) < 0)
high = mid - 1;
else
low = mid + 1;
}
if (found)
{
cout << arrayOfStructs[mid].contactName << endl;
cout << arrayOfStructs[mid].birthday << endl;
cout << arrayOfStructs[mid].addressInfo.streetName << endl;
cout << arrayOfStructs[mid].addressInfo.cityName << endl;
cout << arrayOfStructs[mid].addressInfo.state << " ";
cout << arrayOfStructs[mid].addressInfo.zipcode << " ";
cout << arrayOfStructs[mid].addressInfo.phoneNumber << endl;
cout << arrayOfStructs[mid].typeOfentry << endl;
}
else
cout << "NOT FOUND" << endl;
}
编辑:arrayOfstructs [] .contactName按字母顺序排序,(例如.contactName = Amanda,位于比.contactName = Zorak小的索引)
答案 0 :(得分:2)
如果您尝试输入以空格分隔的名称,则需要使用std::getline
而不是istream::operator>>
。
答案 1 :(得分:0)
因为您还要求提供一般性反馈。请注意,您可能会为每次迭代两次比较相同的字符串。 strcmp返回它是小于,等于还是大于(-1,0,1)。您可以获得返回值并与之进行所有进一步的比较...
int result = strcmp(entryName, arrayOfStructs[mid].contactName);
if (result == 0)
found = true;
else
if (result < 0)
high = mid - 1;
else
low = mid + 1;