【问题标题】:Alphabetical Sorting is backwards using string.compare()使用 string.compare() 向后按字母排序
【发布时间】:2014-04-29 02:29:24
【问题描述】:

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

【问题讨论】:

  • 不应该是 if(mpHead->word.compare(theWord) > 0) 找到第一个字母顺序较高的单词时插入单词吗?

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


【解决方案1】:

看来你已经交换了compare 的参数。将a.compare(b) &lt; 0 视为等同于a &lt; b。然后你会看到你在做什么:

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

您可能指的是if (theWord &lt; 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 &lt;

if(theWord < mpHead->word)

//...

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

【讨论】:

    【解决方案2】:

    只需使用 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,它也允许重复。

    【讨论】:

    • 但是我使用 set 数据结构而不是链表来存储字符串,对吗?这只是一个链表实现,但您的解决方案肯定效率更高。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-27
    • 1970-01-01
    • 2023-03-28
    相关资源
    最近更新 更多