按字母顺序排序是使用string.compare()向后排序

时间:2014-03-21 15:58:18

标签: c++ string sorting linked-list alphabetical

我有一个功能,可以在字母表中的适当位置为链表添加​​单词。它应该按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;
}

2 个答案:

答案 0 :(得分: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");
// ...

注意:&lt; set&gt;中还有std :: multiset,它也允许重复。

答案 1 :(得分: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)