需要帮助将qsort与结构数组一起使用

| 现在,我已经看到了各种示例,但我不明白它们的含义。 这是我的结构
typedef struct profile{
    char gender[1];
    double soc;
       . . .
} PROFILE;
soc是我要排序的社会安全号码。 我知道您需要一个比较功能,但是我不知道该如何提出我需要的确切内容。     
已邀请:
这是对C语言中的结构数组使用
qsort
的示例
/* 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
几乎应该肯定不是
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;
}
感谢您指出ѭ6 这是一个完整的示例(已归档):使用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
和ѭ13with无法与减法正确比较。它也不适用于浮点值。 上述方法可用于所有可比较的类型,包括,4ѭ(
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);
    }
}
    

要回复问题请先登录注册