如何在C中对结构数组进行排序?
发布时间:2020-12-16 10:43:22 所属栏目:百科 来源:网络整理
导读:我有一系列以下结构 typedef struct _my_data_ { unsigned int id; double latitude; double longitude; unsigned int content_len; char* name_dyn; char* descr_dyn;} mydata; 并希望按ID升序排序.我读过可以使用qsort函数对数组进行排序,但我不确定如何在
我有一系列以下结构
typedef struct _my_data_ { unsigned int id; double latitude; double longitude; unsigned int content_len; char* name_dyn; char* descr_dyn; } mydata; 并希望按ID升序排序.我读过可以使用qsort函数对数组进行排序,但我不确定如何在排序结构时正确使用它. 任何帮助,将不胜感激. 解决方法
你需要一个结构比较器函数来匹配qsort()所期望的函数的原型,即:
int md_comparator(const void *v1,const void *v2) { const mydata *p1 = (mydata *)v1; const mydata *p2 = (mydata *)v2; if (p1->id < p2->id) return -1; else if (p1->id > p2->id) return +1; else return 0; } 如果您遇到更复杂的排序标准,这仍然是一个很好的基础,因为您可以使用相同的骨架添加辅助条件: int md_comparator(const void *v1,const void *v2) { const mydata *p1 = (mydata *)v1; const mydata *p2 = (mydata *)v2; if (p1->latitude < p2->latitude) return -1; else if (p1->latitude > p2->latitude) return +1; else if (p1->longitude < p2->longitude) return -1; else if (p1->longitude > p2->longitude) return +1; else return 0; } 显然,这可以根据您的需要重复多种标准.如果需要调用一个函数(strcmp()?)来比较值,请调用一次,但将返回值分配给局部变量并使用两次: int md_comparator(const void *v1,const void *v2) { const mydata *p1 = (mydata *)v1; const mydata *p2 = (mydata *)v2; int rc; if (p1->latitude < p2->latitude) return -1; else if (p1->latitude > p2->latitude) return +1; else if (p1->longitude < p2->longitude) return -1; else if (p1->longitude > p2->longitude) return +1; else if ((rc = strcmp(p1->name_dyn,p2->name_dyn)) < 0) return -1; else if (rc > 0) return +1; else return 0; } 此外,当数据成员是无符号整数时,此模板有效,并且在比较有符号整数时避免了溢出问题.请注意您有时可能会看到的捷径,即: int md_comparator(const void *v1,const void *v2) /* BAD */ { /* BAD */ const mydata *p1 = (mydata *)v1; /* BAD */ const mydata *p2 = (mydata *)v2; /* BAD */ return(p1->id - p2->id); /* BAD */ } /* BAD */ 如果id是无符号的(两个无符号整数的差异从不为负),则是坏的,如果整数是有符号的并且具有大幅度和相反的符号,则会溢出. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |