现在,我看到了各种例子,但我不明白它们的意思。
这是我的结构
typedef struct profile{
char gender[1];
double soc;
. . .
} PROFILE;
其中 soc 是我要排序的社会安全号码。
我知道您需要一个比较功能,但我不知道如何提出我需要的确切内容。
qsort
这是在 C 中使用结构数组的示例
/* qsort example */
#include <stdio.h>
#include <stdlib.h>
typedef struct {
int price;
int id;
} order;
order list[6];
int i = 0;
int compare (const void * a, const void * b)
{
order *orderA = (order *)a;
order *orderB = (order *)b;
return ( orderB->price - orderA->price );
}
int main ()
{
srand ( time(NULL) );
printf("Before sorting\n");
for(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);
}
printf("AFTER sorting\n");
int n;
qsort (list, 6, sizeof(order), compare);
for (n=0; n<6; n++)
printf ("Order id = %d Price = %d \n",list[n].id, list[n].price);
return 0;
}
希望能帮助到你
卡特琳娜·迪米特里斯
(所有关于pitsi)
您Soc
几乎可以肯定不是 type 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 *.
这是一个完整的示例(已存档):使用 C qsort() 函数对结构进行排序
比较器的严格版本采用两个常量 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 字段。这就是您处理任何多部分比较的方式。
要对数组进行排序,请使用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
不能正确地与减法进行比较。它也不适用于浮点值。
上述方法可用于所有可比较的类型,包括double
除了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);
}
}