对c中struct的链表进行排序



我正在尝试根据结构"capacite"的元素按升序排序链表。. 但它没有给出结果。我犯了什么错误?这是我的代码

typedef struct avion avion;
typedef avion*  aliste;
struct avion
{
char code[20];
int capacite;
char etat;
int date;
int nvols;
aliste svt;
};

我已经创建了列表。然后是排序函数

void tri(aliste L)
{
aliste i,j,min,tmp;
for (i=L; i->svt != NULL; i=i->svt)
{
min=i;
for (j=i->svt; j != NULL; j=j->svt)
{
if (j->capacite < min->capacite)
min=j;
}
if (min != i)
{
tmp=min;
min=i;
i=tmp;
}
}
}

看起来您正在尝试冒泡排序您的列表。一种快速而不太实用的修复方法是交换节点的内容:

void tri(aliste L)
{
aliste i,j,min;
avion tmp;
...
if (min != i)
{
tmp=*min;
*min=*i;
*i=tmp;
}
}
}
这里的好消息是,从调用者传递过来的L指针仍然指向列表的开头。缺点是,如果它复制结构,而只改变svt指针,那么效率会高得多。但是:
  • 你必须返回给调用者一个指向新头部的指针
  • 从单链表中移动元素需要记录前一个元素

当你使用冒泡排序时,这不是一个非常有效的算法,我假设你只打算处理小列表,性能不是必需的,所以你自己看……

在C中实现结构体链表的一种常用方法是在https://www.geeksforgeeks.org/linked-list-set-1-introduction/

基本上在结构体内部有一个指向链表中下一个节点的指针next,它建立了链表功能:

struct Node { 
int data; 
struct Node* next; 
}; 
对于这个更常见的C链表实现,您可以在网上找到许多排序算法(qsort, mergessort,…)的源代码。在这样的例子中,你必须为多个参数实现功能,因为你的节点(链表)有多个数据字段…

按多个参数排序链表

typedef avion* aliste;是一个好主意,类型定义指针?

最新更新