[英]using a qsort to sort struct pointers by different variables
我试图在指向结构的指针的上下文中理解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按字母顺序排列,使用struct中的名称和salesArray从最大到最小,使用struct中的total
比较方法和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);
对名称进行排序的示例:
#include <stdio.h>
#include <stdlib.h>
#define MAX_NAME 20
#define NUM_MONTHS 12
typedef struct EMP {
char name[MAX_NAME + 1];
int monthSales[NUM_MONTHS];
int total;
} Emp;
int compareName(const void * a, const void * b)
{
return (strcmp(((Emp*)a)->name, ((Emp*)b)->name));
}
int main()
{
Emp *data;
int empSize = 100;
qsort(data, empSize, sizeof(Emp), compareName);
// qsort(data, empSize, sizeof(Emp), compareSales);
return 0;
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.