【问题标题】:Remove function not working properly删除功能无法正常工作
【发布时间】:2013-07-06 14:13:09
【问题描述】:

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

【问题讨论】:

  • 你的意思是,如果找不到确切的单词,它会删除按字母顺序排列的下一个

标签: c++ linear-search


【解决方案1】:

我看到的几个问题:

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”并说,嘿! “猫”>“棕色”!让我们返回“猫”的索引!然后 remove 方法会,嗯,删除“Cat”...

【讨论】:

  • 如果我调整 str[i]>=s 它不会按字母顺序添加它们。我刚刚在我的功能中尝试过。我必须使用顺序搜索来找到插入点,以按字母顺序将字符串添加到我的列表中。
  • @GiBiT09 然后你应该有单独的帮助函数,在插入而不是删除项目时使用。删除项目时需要更改该行;否则你会遇到我在底部描述的问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-23
  • 2011-06-14
  • 2021-12-03
相关资源
最近更新 更多