Моя функция удаления действует. Скажем, если я добавлю «Apple», «Boy», «Cat» в мой массив. Сортирует это по алфавиту. Когда я что-то удаляю, скажем «Мальчик», это удаляет это нормально. Но если я введу «Браун», это удалит «Кот» из моего списка. Он всегда удалит тот, что находится под ним в алфавитном порядке, если он не найдет его в списке. Если у меня есть те строки, которые я указал выше, и я ввожу в «Собака», ничего не происходит, потому что «Кошка» перед «Собака». Есть идеи?
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;
}
Я вижу пару проблем:
В 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», заключается в лексикографической операции «больше чем» в методе поиска. Когда вы дадите ему «Браун», он увидит «Кот» и скажет: «Эй! «Кот»> «Коричневый»! Вернем индекс «Кошка»! А затем метод удаления будет, ну, в общем, удалить «Cat» …
Других решений пока нет …