2

我的删除功能正在发挥作用。假设我将“Apple”、“Boy”、“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;
}
4

1 回答 1

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”的原因是搜索方法中的字典“大于”操作。当你给它“Brown”时,它会看到“Cat”并说,嘿!“猫”>“棕色”!让我们返回“猫”的索引!然后删除方法会删除“Cat”......

于 2013-07-06T14:19:38.760 回答