如何实现qsort()来处理结构数组?

时间:2016-09-16 16:59:30

标签: c arrays struct structure qsort

我必须解决几个C问题,其中大多数都涉及到必须在某处使用qsort(),但无论我从网上获得多少帮助我都无法让它工作。 以此代码为例:

#include <stdio.h>
#include <string.h>
struct date
{
    int day;
    int month;
    int year;
};struct date d[5]={
    {12,12,2012},
    {23,02,2014},
    {31,01,2222},
    {32,21,2011},
    {12,01,1990}
    };

int compare(const void * a, const void * b)
{
    struct date *orderA = (date *)a;
  struct date *orderB = (date *)b;

  return (  orderA->year -orderB->year  );
}
int main()
{
    int i;
    qsort(d,5,sizeof(date),compare);

    for(i=0;i<5;i++)
    printf("%d %d %d\n",d[i].day,d[i].month,d[i].year);
    return 0;

}

我收到的错误是日期未申报,即使已经存在。我根本无法理解比较功能,必须从网上复制它们。请帮帮我。我在大学的老师是一个完全愚蠢的人。

2 个答案:

答案 0 :(得分:1)

date不是一种类型。 struct date是。在引用结构类型时,您需要使用struct关键字。

此外,如果您将比较函数中的指针定义为const,则无需投射。

const struct date *orderA = a;
const struct date *orderB = b;

答案 1 :(得分:0)

您的代码存在轻微问题:您需要包含stdlib.h(适用于qsort()),但您未在示例中使用string.h;您使用date作为结构和类型但不要定义它 - 您可以通过typedef同时将其定义为两者;如果你愿意,你可以将你的比较扩展到数年之后。

针对上述问题重新编写代码:

#include <stdio.h>
#include <stdlib.h>

typedef struct date {
    int day;
    int month;
    int year;
} Date;

int compare(const void *a, const void *b) {
    const Date *date_A = a;
    const Date *date_B = b;

    return date_A->year == date_B->year ? 
        date_A->month == date_B->month ?
            date_A->day - date_B->day
                : date_A->month - date_B->month
                    : date_A->year - date_B->year;
}

int main() {

    Date dates[] = {
        {12, 12, 2012},
        {23, 02, 2014},
        {31, 01, 2222},
        {32, 21, 2011},
        {12, 01, 1990}
    };

    size_t count = sizeof(dates) / sizeof(Date);

    qsort(dates, count, sizeof(Date), compare);

    for (int i = 0; i < count; i++) {
        Date *date = &dates[i];
        printf("%d %d %d\n", date->day, date->month, date->year);
    }

    return 0;
}