使用带有结构数组的qsort需要帮助

现在,我已经看到了各种各样的例子,但我不明白他们的意思。

这是我的结构

typedef struct profile{ char gender[1]; double soc; . . . } PROFILE; 

soc是社会安全号码,我将要排序。

我知道你需要一个比较function,但我不知道如何提出我需要的确切内容。

下面是在C中使用qsort作为结构数组的示例

 /* qsort example */ #include  #include  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几乎肯定不是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类型,则简单的值减法会产生不正确的结果。 例如, -2INT_MAX无法与减法方法正确比较。 它也不适用于浮点值。

  • 上述方法可用于所有类似的类型,包括除NaN外的double类型。

如果你想处理NaN ,这里是如何在最后对它们进行分组:

 #include  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); } }