2013-07-06 9 views
2

Моя функция удаления действует. Допустим, если я добавлю «Яблоко», «Мальчик», «Кошка» в свой массив. Он сортирует его по алфавиту. Когда я что-то удаляю, давайте скажем «Мальчик», он удаляет его. Но если я вхожу в «Браун», он удаляет «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; 
} 
+0

Вы имеете в виду, что он удаляет тот, который по алфавиту * следующий *, если он не может найти точное слово? – feralin

ответ

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++) 

С помощью этих исправлений, ваш алгоритм необходимо работа.

Причина, по которой вы попытаетесь удалить «Браун» и удалить «Cat» из-за лексикографической операции «больше» в методе поиска. Когда вы дали ему «Браун», он увидит «Кошку» и скажет: «Эй! «Кошка»> «Браун»! Вернем индекс «Cat»! И тогда метод удаления удалит «Cat» ...

+0

Если я отрегулирую str [i]> = s, он не будет добавлять их в алфавитном порядке. Я просто попробовал это в своей функции. Я должен использовать последовательный поиск, чтобы найти точку вставки, чтобы добавить строки в мой список в алфавитном порядке. –

+0

@ GiBiT09 Затем у вас должны быть отдельные вспомогательные функции, которые следует использовать при вставке, а не в удалении. Вы должны изменить эту строку при удалении элемента; иначе у вас будет проблема, которую я описал внизу. – feralin

+0

Спасибо, я получил его сейчас. –

Смежные вопросы