gpt4 book ai didi

c - 使用 qsort 按不同变量对结构指针进行排序

转载 作者:行者123 更新时间:2023-12-01 12:55:55 30 4
gpt4 key购买 nike

我试图在结构指针的上下文中理解 c 库 qsort。这是我想要操作的现有代码:

结构:

#define MAX_NAME 20
#define NUM_MONTHS 12

typedef struct EMP {
char name[MAX_NAME+1];
int monthSales[NUM_MONTHS];
int total;
} Emp;

数据的全局初始化及其大小:

Emp *data;//where all entries are kept
int empSize;

我已经构建了 2 个 Emp 指针数组,我想以不同的顺序引用数据:

Emp *nameArray[empSize];//an array of pointers to point to entries alphabetically
Emp *salesArray[empSize]; //an array of pointers to pointing to entries by sales

在相同分配后,我想使用 qsort 以不同方式排列它们。nameArray 按字母顺序排列,使用结构中的名称和salesArray 从大到小,使用结构中的总数

比较方法和 qsort 参数应该是什么样的?

谢谢

最佳答案

你只需要定义两个不同的比较函数。每个比较函数都应该接受两个指向 void 的指针(在这种情况下,您会将它们转换为 Emp ** 类型),然后返回一个负整数、零或一个正整数(如果第一个条目是分别小于、等于或大于第二个。

对于基于总数的排序,您可以简单地从第一个中减去第二个total。如果第一个总数小于第二个,则结果为负数,而当第一个总数大于第二个时,则相反。当它们相等时,返回零。

int compareByTotal(const void *first, const void *second)
{
int firstTotal = (*(Emp **)first)->total;
int secondTotal = (*(Emp **)second)->total;

return firstTotal - secondTotal;
}

第二个,因为它是一个字符串比较,可以返回 strcmp 的值(它遵循相同的返回值约定):

int compareByName(const void *first, const void *second)
{
const char *firstName = (*(Emp **)first)->name;
const char *secondName = (*(Emp **)second)->name;

return strcmp(firstName, secondName);
}

然后您可以调用 qsort 并传入这些函数名称:

/* given: */
Emp *nameArray[empSize];//an array of pointers to point to entries alphabetically
Emp *salesArray[empSize]; //an array of pointers to pointing to entries by sales

/* use: */
qsort(nameArray, empSize, sizeof(*nameArray), &compareByName);
qsort(salesArray, empSize, sizeof(*salesArray), &compareByTotal);

关于c - 使用 qsort 按不同变量对结构指针进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9846508/

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