如何在 C++ 中使用一个变量对两部分链表进行排序?
Posted
技术标签:
【中文标题】如何在 C++ 中使用一个变量对两部分链表进行排序?【英文标题】:How to sort a two-part linked list using one variable in C++? 【发布时间】:2021-03-10 07:37:34 【问题描述】:我正在尝试创建一个列出人名及其出生年份的链接列表。此列表应在输入后按出生年份升序排序。到目前为止,我已经按年份对列表进行了排序,这正是我想要的——但我不知道如何在排序顺序发生变化时移动名称。
节点类定义如下:
class node
public:
string name, value;
int year;
node *Next;
*head = NULL, *tail = NULL;
使用以下 void 函数对输入进行升序排序:
void sort (node *head)
while (head)
node *min = head;
node *cur = head -> Next;
while (cur)
if ((min -> year) > (cur -> year))
min = cur;
cur = cur -> Next;
int x = head -> year;
head -> year = min -> year;
min -> year = x;
head = head -> Next;
并使用另一个 void 函数将其输出到屏幕:
void print (node *x)
if (x == NULL)
return;
node *cur = x;
while (cur)
cout << cur -> name << " (" << cur -> year << ")\n";
cur = cur -> Next;
cout << endl;
在上面的代码中,year
指的是出生年份,name
指的是人名。这是一个问题,因为如果我输入“Person 1”作为 2000 年出生的人,而将“Person 2”作为 1995 年出生的人输入,输出会说 Person 1 出生于 1995 年,Person 2 出生于 2000 年之后的数字是排序。有没有办法用名字对年份进行排序?
【问题讨论】:
我建议你应该简单地将name
换成year
。为什么存在“使用一个变量”的约束?
我很确定您的分配希望您不要移动变量的名称,而是重新链接链接列表中的节点。
最好交换节点的地址,而不是交换节点的内容。看看这里geeksforgeeks.org/…
啊,当然,谢谢@MikeCAT。还要感谢您提供 GFG 链接 Harry,我一直在寻找类似的东西!
【参考方案1】:
当你交换year
时,你也应该交换name
。
您可以使用std::swap
来交换变量,而无需使用临时变量。
#include <algorithm>
void sort (node *head)
while (head)
node *min = head;
node *cur = head -> Next;
while (cur)
if ((min -> year) > (cur -> year))
min = cur;
cur = cur -> Next;
std::swap(head -> year, min -> year);
std::swap(head -> name, min -> name);
// you may also want this
// std::swap(head -> value, min -> value);
head = head -> Next;
【讨论】:
以上是关于如何在 C++ 中使用一个变量对两部分链表进行排序?的主要内容,如果未能解决你的问题,请参考以下文章