我的移除功能正在起作用。让我们说如果我将“Apple”,“Boy”,“Cat”添加到我的阵列中。它按字母顺序排序。当我删除某些东西时,让我们说“男孩”,它会删除它。但如果我输入“Brown”,它会从我的列表中删除“Cat”。如果它没有在列表中找到它,它将始终按字母顺序删除它下面的那个。如果我有上面提到的那些字符串并且我输入“Dog”,则没有任何反应,因为“Cat”在“Dog”之前。有任何想法吗?
void StringList::remove(string s)
{
int loc = search(s, 0, numberOfStrings);
if(loc!=-1)
{
for(int i=loc; i<(numberOfStrings)-1; i++)
{
str[i] = str[i+1];
}
numberOfStrings--;
}
}
int StringList::search(string s, int start, int end)
{
for(int i=start; i<=end; i++)
{
if(str[i]>=s)
{
return i;
}
}
return -1;
}
答案 0 :(得分:3)
我看到了几个问题:
在StringList::search
中,
if (str[i] >= s)
应改为
if (str[i] == s)
您想要找到完全匹配,而不是第一个按字典顺序排列的“更大”字符串,对吗?
接下来,StringList::remove
中的第一行应该使用
numberOfStrings - 1
而不仅仅是
numberOfStrings
如果numberOfStrings = 3
,则您要搜索索引0, 1, 2
,而不是0, 1, 2, 3
。
但是,您也可以更改(在函数StringList::search
中)行
for (int i = start; i <= end; i++)
到
for (int i = start; i < end; i++)
使用这些修补程序,您的算法应工作。
您尝试删除“Brown”并删除“Cat”的原因是因为搜索方法中的词典“大于”操作。当你给它“布朗”时,它会看到“猫”并说,嘿! “猫”&gt; “棕色”!让我们返回“猫”的索引!然后删除方法就会删除“Cat”......