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