簡體   English   中英

用於比較結構以便對列表進行排序的功能

[英]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的技術缺陷。例如,將Airplaneint進行比較在邏輯上沒有任何意義。

如果你想比較有點類似的事情,你可以看看工會。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM