我有一个函数,可以将一个单词添加到字母表中适当位置的链接列表中。应该将其排序为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;
}

最佳答案

看来您已经交换了compare的参数。认为a.compare(b) < 0a < 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)

关于c++ - 使用string.compare()向后按字母顺序排序,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22563560/

10-12 06:31