C 如何对结构数组进行qsort排序
因此,我的任务是获取一个二进制文件,将其读入由结构组成的数组,然后根据结构中的数组对其进行排序。我被困的部分是分类。我不确定是应该将其作为数组进行排序(因为二进制文件现在是数组)还是作为结构进行排序。下面是我的部分代码C 如何对结构数组进行qsort排序,c,arrays,sorting,struct,qsort,C,Arrays,Sorting,Struct,Qsort,因此,我的任务是获取一个二进制文件,将其读入由结构组成的数组,然后根据结构中的数组对其进行排序。我被困的部分是分类。我不确定是应该将其作为数组进行排序(因为二进制文件现在是数组)还是作为结构进行排序。下面是我的部分代码 typedef struct { char FlightNumber[7]; char OriginCode [5]; char DestinationCode [5]; int Date []; } FLIGHT; int main(){ F
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 );
}
}
typedef结构{
char FlightNumber[7];
字符源代码[5];
char DestinationCode[5];
国际日期[];
}飞行;
int main(){
飞行数据[3000];
/*打开文件,将其放入数组中,然后关闭*/
/*尝试根据原始代码对其进行排序*/
整数比较(常数飞行*a,常数飞行*b){
航班*ia=(航班*)a;
航班*ib=(航班*)b;
返回strcmp(ia->OriginCode,ib->OriginCode);}
qsort(航班数据,3000,航班大小,比较);
/*要查看排序是否有效*/
对于(i=0;i<100;i++){
printf(“%i)%s,%s,%s\n”,i,FlightData[i]。FlightNumber,FlightData[i]。源代码,FlightData[i]。DestinationCode);
}
}
基本上,我不知道如何编写比较。请注意,
Date
在这里的大小为零,因为您没有为它分配任何空间。取消引用它将是未定义的行为
qsort比较函数必须具有以下类型:
int compare(const void *a, const void *b)
只要你改变你的函数签名来匹配它,你的比较器就会工作 请注意,
Date
在这里的大小为零,因为您没有为它分配任何空间。取消引用它将是未定义的行为
qsort比较函数必须具有以下类型:
int compare(const void *a, const void *b)
只要你改变你的函数签名来匹配它,你的比较器就会工作 请注意,
Date
在这里的大小为零,因为您没有为它分配任何空间。取消引用它将是未定义的行为
qsort比较函数必须具有以下类型:
int compare(const void *a, const void *b)
只要你改变你的函数签名来匹配它,你的比较器就会工作 请注意,
Date
在这里的大小为零,因为您没有为它分配任何空间。取消引用它将是未定义的行为
qsort比较函数必须具有以下类型:
int compare(const void *a, const void *b)
只要你改变你的函数签名来匹配它,你的比较器就会工作 首先,比较器函数应具有签名:
int compare(const void *v1, const void *v2);
接下来,将空心指针转换为结构指针:
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,您真的不需要可变大小的数组来描述日期。您应该使用固定大小的数组,甚至是时间戳来给出时间和日期。剩下的问题是一天出发另一天到达的航班——通宵航班和跨越国际日期线的航班。实际上,你可能需要一个出发时间和一个到达时间
另请参见(毫无疑问,除其他外):
int compare(const void *v1, const void *v2);
接下来,将空心指针转换为结构指针:
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,您真的不需要可变大小的数组来描述日期。您应该使用固定大小的数组,甚至是时间戳来给出时间和日期。剩下的问题是一天出发另一天到达的航班——通宵航班和跨越国际日期线的航班。实际上,你可能需要一个出发时间和一个到达时间
另请参见(毫无疑问,除其他外):
int compare(const void *v1, const void *v2);
接下来,将空心指针转换为结构指针:
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,您真的不需要可变大小的数组来描述日期。您应该使用固定大小的数组,甚至是时间戳来给出时间和日期。剩下的问题是一天出发另一天到达的航班——通宵航班和跨越国际日期线的航班。实际上,你可能需要一个出发时间和一个到达时间
另见(除其他外,无d