[英]Function to compare structures in order to sort a list
我在C中有一个抽象的数据类型,事物的清单,ist节点有一个void *指针,我试图做的是创建一个函数来比较不同结构的特定字段,以便对事物列表进行排序。
typedef struct node{
char *name;
void *thing;
struct node *next;
}Node;
这是我正在使用的节点,我已经创建了一个整数列表,结构列表和te比较函数,但是我不知道如何对不同的结构执行比较函数。 例如:
鉴于以下类型:
typedef struct main{
float weight;
char*model;
float maxspeed;
}Main;
typedef struct airplane{
float weight;
float maxspeed;
}Airplane;
typedef struct car{
char*model;
float maxspeed;
}Car;
这就是函数,因此您对我要执行的操作有一个了解,它不起作用,Main具有在一个或另一个结构中都不存在的字段。
int comparefunction(void*a,void*b){
Main a1, a2;
a1=*(Main*)a;
a2=*(Main*)b;
return a1.weight-a2.weight;
}
此功能(不起作用)作为参数传递给链接节点的功能,以便使用comparefunction。
//insert prototype:
//insert(Node*listp,Node*newp,int(*func_comp)(void*,void*));
list=insert(list,newItem(&car1),comparefunction);
list=insert(list,newItem(&airplane1),comparefunction);
list=insert(list,newItem(&airplane2),comparefunction);
如何比较两个或多个不同结构的单个字段? 假设我知道每个结构包含什么
好吧,您的car
结构没有 weight
域,所以我不确定您要在这里完成什么。 如果您的car
结构看起来像
typedef struct car {
float weight;
char* model;
float maxspeed;
} Car;
我认为您的功能会起作用。 请注意,要比较的成员到每个结构( 包括Main
struct)中的偏移量都是相同的,这一点很重要。
编辑
这确实有效 。
根据评论进行的另一项编辑
您无法比较两个完全不相关的事物。 这不是C的技术缺陷。例如,将Airplane
和int
进行比较在逻辑上没有任何意义。
如果你想比较有点类似的事情,你可以看看工会。
struct attributes{
float weight;
// other common things?
};
struct thing {
enum { Car, Main, Airplane } type;
struct attributes attrs;
union {
struct Car car;
struct Main main;
struct Airplane airplane;
} other_thing;
};
您将更改列表以存储事物结构,该结构封装了所有可能的类型。 每种类型的公共元素都提取到属性struct中。 然后,您的compare函数将对事物结构的属性结构进行操作。 这里使用并集仅在结构事物中为最大的并集元素创建足够的空间,因此您不会浪费存储所有三个结构而仅使用一个的空间。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.