[英]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.