现在,我已经看到了各种各样的例子,但我不明白他们的意思。这是我的结构
typedef struct profile{ char gender[1]; double soc; . . . } PROFILE;
其中soc是社会安全号码,我将根据它进行排序。我知道你需要一个比较函数,但我不知道如何提出我需要的确切的东西。
zte4gxcn1#
下面是一个在C中使用qsort作为结构体数组的例子
qsort
#include <stdio.h> #include <stdlib.h> typedef struct { int price; int id; } order; int compare(const void *a, const void *b) { order *orderA = (order *)a; order *orderB = (order *)b; return (orderB->price - orderA->price); } int main() { order list[6]; srand(time(NULL)); printf("Before sorting\n"); for (int i = 0; i < 6; i++) { list[i].price = rand() % 10; list[i].id = i; printf("Order id = %d Price = %d\n", list[i].id, list[i].price); } qsort(list, 6, sizeof(order), compare); printf("AFTER sorting\n"); for (int n = 0; n < 6; n++) { printf("Order id = %d Price = %d\n", list[n].id, list[n].price); } return 0; }
wixjitnu2#
你的Soc几乎肯定不是double类型,但无论如何,这里有一个比较函数需要返回的例子:
Soc
double
int compare(const void *p1, const void *p2) { const struct profile *elem1 = p1; const struct profile *elem2 = p2; if (elem1->soc < elem2->soc) return -1; else if (elem1->soc > elem2->soc) return 1; else return 0; }
感谢您指出const void *.下面是一个完整的例子(已存档):Sorting Structures with the C qsort() Function
const void *.
cgh8pdjw3#
比较器的严格版本有两个常量void指针:
int compare(const void *v1, const void *v2) { const struct profile *p1 = v1; const struct profile *p2 = v2; if (p1->gender > p2->gender) return(+1); else if (p1->gender < p2->gender) return(-1); else if (p1->soc > p2->soc) return(+1); else if (p1->soc < p2->soc) return(-1); else return(0); }
这首先比较性别字段,然后比较soc字段。这是处理任何多部分比较的方法。
wsxa1bj14#
要对数组进行排序,请使用qsort()并传递一个比较函数。下面是一个为price成员的所有可能值生成正确结果的方法:
qsort()
price
typedef struct profile { char gender[1]; double soc; int price; ... } PROFILE; int compare_price(const void *a, const void *b) { const PROFILE *oa = a; const PROFILE *ob = b; return (oa->price > ob->price) - (oa->price < ob->price); } int compare_soc(const void *a, const void *b) { const PROFILE *oa = a; const PROFILE *ob = b; return (oa->soc > ob->soc) - (oa->soc < ob->soc); }
备注:
int
-2
INT_MAX
NaN
如果你想处理NaN,下面是如何在最后对它们进行分组:
#include <math.h> int compare_soc_nan_at_the_end(const void *a, const void *b) { const PROFILE *oa = a; const PROFILE *ob = b; if (isnan(oa->soc)) { return isnan(ob->soc) ? 0 : 1; } else if (isnan(ob->soc)) { return -1; } else { return (oa->soc > ob->soc) - (oa->soc < ob->soc); } }
4条答案
按热度按时间zte4gxcn1#
下面是一个在C中使用
qsort
作为结构体数组的例子wixjitnu2#
你的
Soc
几乎肯定不是double
类型,但无论如何,这里有一个比较函数需要返回的例子:感谢您指出
const void *.
下面是一个完整的例子(已存档):Sorting Structures with the C qsort() Function
cgh8pdjw3#
比较器的严格版本有两个常量void指针:
这首先比较性别字段,然后比较soc字段。这是处理任何多部分比较的方法。
wsxa1bj14#
要对数组进行排序,请使用
qsort()
并传递一个比较函数。下面是一个为
price
成员的所有可能值生成正确结果的方法:备注:
int
类型,则简单的值减法会产生错误的结果。例如,-2
和INT_MAX
不能用减法正确比较。它也不适用于浮点值。NaN
之外的double
。如果你想处理
NaN
,下面是如何在最后对它们进行分组: