gpt4 book ai didi

c - 如何在 C 中对结构体数组进行排序?

转载 作者:行者123 更新时间:2023-11-30 16:38:27 25 4
gpt4 key购买 nike

我有一个包含以下结构的数组:

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() 期望的函数原型(prototype)相匹配的结构比较器函数,即:

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 是无符号的(两个无符号整数的差永远不会是负数),则很糟糕,并且如果整数是有符号的并且大小很大且符号相反,则可能会溢出。

关于c - 如何在 C 中对结构体数组进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47487398/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com