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

时间:2014-08-29 09:19:50

标签: c++ string sorting linked-list

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

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

2 个答案:

答案 0 :(得分:2)

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

// 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&lt;相反,但我想保持简单)

原始代码中的用法:

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

答案 1 :(得分:-2)

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

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

希望这有帮助。

卡尔斯。