对链表中的字符串进行排序



该函数工作正常,但当我多次插入同一姓氏时,就会出现问题。请帮忙,这是我的学校项目。

void sortList(node*head)
{
    node*temp2;
    node*temp3;
    string tmp, tmp1, tmp2;
    unsigned long long tmp3;
    unsigned long long num;
    for(temp2= head; temp2 != NULL; temp2 = temp2->next)
    {
        for(temp3 = temp2-> next; temp3 != NULL; temp3 = temp3 ->next)
        {
            if(temp2 ->surname > temp3 ->surname)
            {
                tmp  = temp2 ->surname;
                tmp1 = temp2 ->name;
                tmp2 = temp2 ->date;
                tmp3 = temp2 ->num;
                temp2 ->name = temp3 ->surname;
                temp2 ->surname = temp3 ->name;
                temp2 ->date = temp3 -> date;
                temp2 ->num  = temp3 -> num;
                temp3 ->surname = tmp;
                temp3 ->name = tmp1;
                temp3 ->date = tmp2;
                temp3 ->num  = tmp3;
            }
        }
    }
}

在代码的交换部分有一个简单的错误:

// temp2->name = temp3->surname;
// temp2->surname = temp3->name;
// should be:
temp2->name = temp3->name;
temp2->surname = temp3->surname;

正如其他人已经指出的那样,代码可能会更干净,这也有助于避免此类错误(至少更容易发现)。

我如何确保如果他们有相同的姓氏,那么应该使用他们名字的先后顺序来确定他们的顺序Jdons

在这种情况下,我建议使用辅助函数来确定两个节点的顺序:

bool isLessThan(node* lhs, node* rhs)
{
    if (lhs->surname == rhs->surname)
    {
        // if they have the same surname,
        // use the firstname
        return lhs->name < rhs->name;
    }
    else
    {
        // else use surname
        return lhs->surname < rhs->surname;
    }
}

(这不是最有效的方法,可以使用运算符<,但我想保持简单)

在原始代码中的用法:

for(temp2= head; temp2 != NULL; temp2 = temp2->next)
{
    for(temp3 = temp2-> next; temp3 != NULL; temp3 = temp3 ->next)
    {
        if(!isLessThan(temp2, temp3))
        {
            [...]
        }
    }
}

首先,我将通过使用更多描述性变量来提高代码的可读性。其次,我将使用STL函数和容器来解决这个气泡排序算法。

假设您必须使用自己的实现,我建议查看您在这里使用的字符串::operator>(…)函数。如果你愿意,你可以把它张贴在这里,这样我们就可以审查它。

希望这能有所帮助。

Carles。

相关内容

  • 没有找到相关文章

最新更新