如何在 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++ 中使用一个变量对两部分链表进行排序?的主要内容,如果未能解决你的问题,请参考以下文章

归并排序

在 C++ 中使用链表按字母顺序对字符串进行排序

JQuery UI Sortable - 如何在一个容器中对两种类型的项目进行排序

如何在双向链表 C++ 上使用插入排序?

单链表快速排序

单链表快速排序