用c语言对链表进行两次排序

用c语言对链表进行两次排序,c,linked-list,C,Linked List,我对链接列表排序有问题。我想对它进行两次排序,如下所示: 输入 a2 B 2 1 C02 D 0 1 我希望输出如下所示: c01 D 0 2 B 2 1 A 2 2 正如您所看到的,我想要的输出是按第二列和第三列排序的。我只能使用此代码按第二列进行排序。 void排序(常量节点*n) { 节点*列表,*通过; 列表=n; 对于(;列表->下一步!=NULL;列表=列表->下一步) {for(pass=list->next;pass!=NULL;pass=pass->next) 如果(列表

我对链接列表排序有问题。我想对它进行两次排序,如下所示:

输入

a2
B 2 1
C02
D 0 1
我希望输出如下所示:

c01
D 0 2
B 2 1
A 2 2
正如您所看到的,我想要的输出是按第二列和第三列排序的。我只能使用此代码按第二列进行排序。

void排序(常量节点*n)
{
节点*列表,*通过;
列表=n;
对于(;列表->下一步!=NULL;列表=列表->下一步)
{for(pass=list->next;pass!=NULL;pass=pass->next)
如果(列表->时间<通过->时间)
{交换(列表,通过);
}
}
}

John C给出了一个很好的提示(从最低有效键检查到最高有效键):


形式上的术语是基数排序,但简短的版本是重复排序,从最低有效键到最高有效键,前提是您有一个稳定的排序(您的排序是)。或者您可以在
if
之后添加一个条件,以检查
时间是否相等,您应该按另一个元素排序。@JohnC我到处都找过了,但在列表中的两个变量中找不到它,请问有什么帮助吗?
char cl; int time; int lng;
int comp(const void *pa, const void *pb)
{
    const node *a = (const node *)pa;
    const node *b = (const node *)pb;

    return (a->lng < b->lng) ? 1 :
           (a->time < b->time) ? 1 :
           (a->cl < b->cl) ? 1 : 0;
}

void sort(const node *n, int (*comp)(const void *, const void *))
{
    node *list, *pass;

    list = n;
    for (; list->next != NULL; list = list->next) {
        for (pass=list->next; pass!=NULL; pass=pass->next) {
            if (comp(list, pass)) {
                swap(list, pass);
            }
        }
    }
}
sort(node, comp);