Алфавитная сортировка выполняется в обратном порядке с помощью string.compare ()

У меня есть функция, которая добавляет слово в связанный список в соответствующем месте в алфавите. Должен быть отсортирован A-Z, но по какой-то причине все наоборот. Я думаю, проблема в том, что я использую string.compare () неправильно, но это может быть что-то другое. Это, вероятно, легко исправить, я просто смотрю на это некоторое время и буду признателен за новую перспективу!

void LinkedList::addWord( const string& theWord )
{
ListNode* toAdd = new ListNode(theWord, NULL);

if( !mpHead ){
mpHead = toAdd;
return;
}

if(mpHead->word.compare(theWord) < 0){
toAdd->pNextNode = mpHead;
mpHead = toAdd;
return;
}

if(mpHead->pNextNode == NULL){
mpHead->pNextNode = toAdd;
return;
}

ListNode* pCurrent = mpHead;
ListNode* pCurrentNext = mpHead->pNextNode;

while( pCurrent->pNextNode->word.compare(theWord) > 0 )
{
pCurrent = pCurrentNext;
pCurrentNext = pCurrentNext->pNextNode;
}

toAdd->pNextNode = pCurrent->pNextNode;
pCurrent->pNextNode = toAdd;
}

1

Решение

Кажется, вы поменялись аргументами compare, Думать о a.compare(b) < 0 как эквивалент a < b, Тогда вы увидите, что вы делаете:

if (Head < theWord) { insert theWord before Head; }

Ты наверное имел ввиду if (theWord < Head) вместо этого, поэтому реальный код будет:

if(theWord.compare(mpHead->word) < 0){
toAdd->pNextNode = mpHead;
mpHead = toAdd;
return;
}

// ...

while( theWord.compare(pCurrent->pNextNode->word) > 0 )
{
pCurrent = pCurrentNext;
pCurrentNext = pCurrentNext->pNextNode;
}

Конечно, так как вы используете только результат каждого compare() однажды, вы могли бы использовать operator < прямо вместо:

if(theWord < mpHead->word)

//...

while( theWord > pCurrent->pNextNode->word)
1

Другие решения

просто используйте std :: set.

#include <set>
#include <string>
// ...
std::set<std::string> s;
s.insert("foo");
s.insert("fred");
// ...

с помощью std :: list (связанный список + разрешены дубликаты):

#include <list>
#include <algorithm>
// ...
std::list<std::string> l;
l.insert(std::lower_bound(l.begin(), l.end(), "foo"), "foo");
l.insert(std::lower_bound(l.begin(), l.end(), "fred"), "fred");
l.insert(std::lower_bound(l.begin(), l.end(), "foo"), "foo");
// ...

примечание: есть также std :: multiset внутри <задавать>, что также позволяет дубликаты.

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector