如何qsort一个struct数组

时间:2014-04-14 04:28:56

标签: c arrays sorting struct qsort

所以我的任务是抓取一个二进制文件,将其读入由结构组成的数组中,然后根据结构中的数组对其进行排序。我坚持的部分是排序。我不确定我是否应该将其排序为数组(因为二进制文件现在是一个数组)或者将其排序为结构。下面是我的代码的一部分。

typedef struct {
    char FlightNumber[7];
    char OriginCode [5];
    char DestinationCode [5];
    int Date [];
} FLIGHT;

int main(){

FLIGHT FlightData [3000];
/*opens file, freads it into the array then closes*/

/*trying to sort it based on OriginCode*/
int compare (const FLIGHT *a, const FLIGHT *b) {
    FLIGHT *ia = (FLIGHT *)a;
    FLIGHT *ib = (FLIGHT *)b;

    return strcmp(ia->OriginCode, ib->OriginCode);}

qsort( FlightData, 3000, sizeof( FLIGHT ), compare);
/*to see if sorting worked...*/
for (i = 0; i < 100; i++){

    printf ("%i) %s, %s, %s\n", i, FlightData[i].FlightNumber, FlightData[i].OriginCode, FlightData[i].DestinationCode );
}
}

基本上我对如何写比较感到迷茫。

3 个答案:

答案 0 :(得分:2)

请注意,此处Date的大小为零,因为您没有为其分配任何空间。取消引用它将是未定义的行为。

qsort比较函数必须具有以下类型:

int compare(const void *a, const void *b)

只要您更改功能签名以匹配此比较器,您的比较器就应该工作。

答案 1 :(得分:1)

首先,比较器功能应具有签名:

int compare(const void *v1, const void *v2);

接下来,将void指针转换为结构指针:

    const FLIGHT *ia = (FLIGHT *)v1;
    const FLIGHT *ib = (FLIGHT *)v2;

接下来,您需要逐个系统地比较事物:

    int rc;

    if ((rc = strcmp(ia->OriginCode, ib->OriginCode)) != 0)
        return rc;
    if ((rc = strcmp(ia->DestinationCode, ib->DestinationCode)) != 0)
        return rc;
    …
    return 0;  // Only if the two entries compare as identical

按原点机场代码,目的地机场代码排序,然后按您可以决定的其他标准(航班号,日期)排序。我注意到您尚未指定日期的存储方式。由于它是一个整数数组(显然是一个“灵活的数组成员”),你可能会按某种顺序分别“年,月,日”。

如果您有一个灵活的数组成员,则不应该定义结构数组,因为您无法在灵活数组成员中存储任何内容。您可以拥有一组指针,但需要单独分配结构。 OTOH,你真的不需要可变大小的数组来描述日期。您应该使用固定大小的数组,甚至是时间戳来提供时间和日期。剩下的问题是飞机在一天起飞并抵达另一天 - 超过国际日期线的过夜和飞行。在实践中,您可能需要出发时间和到达时间。

另见(其中许多人,毫无疑问):

答案 2 :(得分:0)

请参阅以下链接以详细了解qsort 链接:http://www.cplusplus.com/reference/cstdlib/qsort/