【问题标题】:Function to compare structures in order to sort a list比较结构以对列表进行排序的功能
【发布时间】:2015-04-24 01:21:20
【问题描述】:

我在 C 中有一个抽象数据类型,事物列表,ist 节点有一个 void* 指针,我要做的是创建一个函数来比较不同结构的特定字段,以便对我的列表进行排序事物。

typedef struct node{
     char *name;
     void *thing;
     struct node *next;   
}Node; 

这是我正在使用的节点,我已经创建了一个整数列表、结构列表和两者的比较函数,但我不知道如何对不同的结构执行比较函数。例如:

鉴于这些类型:

 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; 
}

这个函数(不起作用)作为参数传递给链接节点的函数,以便使用比较函数。

//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); 

如何比较两个或多个不同结构的单个字段?假设我知道每个结构包含什么

【问题讨论】:

    标签: c list structure abstraction


    【解决方案1】:

    如果你想比较有点相似的东西,你可以看看工会。

    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;
    };
    

    您将更改列表以存储事物结构,该结构封装了所有可能的类型。每种类型的公共元素被提取到属性结构中。然后,您的比较函数将对事物结构的属性结构进行操作。联合在这里仅用于在结构事物中为最大的联合元素创建足够的空间,这样您就不会浪费空间来存储所有三个结构并且只使用一个。

    【讨论】:

      【解决方案2】:

      好吧,您的 car 结构 没有 weight 字段,所以我不确定您要在这里完成什么。如果你的 car 结构看起来像

      typedef struct car {
          float weight;
          char* model;
          float maxspeed;
      } Car;
      

      我认为你的功能会起作用。请注意,您要比较的成员在每个结构包括Main 结构中的偏移量相同,这一点很重要。

      编辑

      This does work.

      另一个基于 cmets 的编辑

      你不能比较两个完全不相关的东西。这不是 C 的技术缺陷。例如比较 Airplaneint 在逻辑上没有任何意义。

      【讨论】:

      • 任务是创建一个异构列表并能够比较结构,这样我就可以按顺序插入节点,无论结构是否相等,我什至可以有一个只有一个int 并且我必须能够将它与结构进行比较,并作为比较的结果返回和 int
      • @user2943683 这没有任何意义。您如何比较 airplaneint
      • 是事物的列表,任何事物的列表!
      • @user2943683 你可以列出一些东西。但是你不能比较两个完全不相关的东西。当您传入 Airplaneint 时,您希望比较函数的结果是什么?
      • 不是整个结构,是结构的一个字段!这是我大学的一个任务,我列出了我的 ADT 清单,现在我必须将它用作程序员。例如,假设一个节点有一个带有字段“value”的结构,另一个节点只指向一个值,我列表的所有其他节点都有一个名为“value”的元素,我想按该值对列表进行排序!如何排序列表完全取决于我,但它必须是异构的......如果我所有的节点都包含相同的内容,那就太容易了!我不知道你现在是否明白我的意思!
      猜你喜欢
      • 2014-05-30
      • 2011-07-09
      • 2013-10-03
      • 1970-01-01
      • 2013-02-13
      • 1970-01-01
      • 2020-12-03
      • 2018-09-10
      • 1970-01-01
      相关资源
      最近更新 更多