gpt4 book ai didi

c - 如何按C中的给定成员对结构数组进行排序

转载 作者:太空宇宙 更新时间:2023-11-04 02:33:15 26 4
gpt4 key购买 nike

我有一个这样的结构:

struct Car {
int weight;
int price;
int speed;
etc..}

我想写一个函数来对这种结构的数组进行排序。

void sortCars(struct Car table[], int tableSize, ?structMemberParameter?)
{
struct Car temp;
int swapped;
for (int i = 0; i < tableSize; i++)
{
swapped = 0;
for (int j = 0; j < tableSize - 1; j++) {
if (table[j].?structMemberParameter? > table[j + 1].?structMemberParameter?) {
temp = table[j + 1];
table[j + 1] = table[j];
table[j] = temp;
swapped = 1;
}
}
if (swapped == 0) {
break;
}
}
}

我应该把什么作为“?structMemberParameter?”?

最佳答案

编写一个比较函数来比较来自两个结构的此类成员并使用 qsort()。您可以在 qsort(3) 中查看示例手册。

这是问题标题的答案,你的问题的答案是你不需要传递成员但比较函数就像 qsort() 一样。

所以if语句变成了

if (compare(&table[j], &table[j + 1]) > 0) ...

和函数签名

typedef int (*cmpfn_type)(const struct Car *const, const struct Car *const);
void sortCars(struct Car table[], int tableSize, cmpfn_type compare);

所以你可以有多个比较函数,比如你想按价格比较,合适的是

int compare_by_price(const struct Car *const A, const struct Car *const B)
{
return (int) (A->price - B->price);
}

不过你应该小心类型转换。

这种方法的好处是,您可以轻松重写比较函数以使用 qsort() 库函数。

注意:在评论中回答您的评论/问题时,您还可以使用枚举器,例如

enum CarProperties {
Speed, Price // ... AND SO ON
};

然后是排序函数,比如

void sort_car_array(struct Car *const array,
size_t size, enum CarProperties sort_property);

您有一个 switch 语句来选择适当的回调以传递给通用排序,例如上面建议的 generic_car_array_sort() 或者甚至直接传递给 qsort() 这将是一个更好的解决方案。

如果您打算为 struct Car 结构提供一个 API,您可以这样做,我认为这是一个非常优雅的解决方案。我还建议使结构不透明,并只允许调用者通过函数设置/获取值。

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

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