C语言 需要对结构体数组使用qsort的帮助

1l5u6lss  于 2023-04-05  发布在  其他
关注(0)|答案(4)|浏览(156)

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

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

其中soc是社会安全号码,我将根据它进行排序。
我知道你需要一个比较函数,但我不知道如何提出我需要的确切的东西。

zte4gxcn

zte4gxcn1#

下面是一个在C中使用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;
}
wixjitnu

wixjitnu2#

你的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

cgh8pdjw

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字段。这是处理任何多部分比较的方法。

wsxa1bj1

wsxa1bj14#

要对数组进行排序,请使用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 <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);
    }
}

相关问题