【问题标题】:Sorting strings in a linked list [closed]对链表中的字符串进行排序[关闭]
【发布时间】:2014-08-29 09:19:49
【问题描述】:

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

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;
            }
        }
    }
}

【问题讨论】:

  • 你可以使用std::swap(或者你自己的swap,如果你不能使用它)来清理代码。
  • 你应该使用合理的、描述性的变量名,而不是tmptmp1tmp2tmp3temp2temp3
  • 我认为没有理由这样假设。 OP 在他的函数体中似乎使用了 std::string,所以没有理由相信他以前没有。

标签: c++ string sorting linked-list


【解决方案1】:

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

// 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;
    }
}

(这不是最有效的方法,可以使用 operator

在您的原始代码中的用法:

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

【讨论】:

  • 我已经更正并且工作正常,谢谢,但还有一件事,我如何确保如果他们有相同的姓氏,那么应该使用他们的名字的优先级来确定他们的顺序?
  • (在回答帖子的编辑中回答了您的后续问题)
【解决方案2】:

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

假设您必须使用自己的实现,我建议您查看您在此处使用的 string::operator>(...) 函数。如果您愿意,可以在此处发布,以便我们进行审核。

希望这会有所帮助。

卡尔斯。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-09-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-02
    • 2021-10-21
    • 1970-01-01
    相关资源
    最近更新 更多