排序结构数组的成员

给定一个结构数组(在C中)我试图以数字顺序打印出性别组和子顺序的结果。 例如:

struct employee{ char gender[13] char name[13]; int id; }; 

假设我像这样定义结构数组:

 struct employee info[2]={{"male","Matt",1234},{"female","Jessica",2345},{"male","Josh",1235}}; 

我怎么能打印结果像

 1234 Matt 1235 Josh 2345 Jessica 

您需要实现一个排序函数,根据需要比较结构

 int compare(const void *s1, const void *s2) { struct employee *e1 = (struct employee *)s1; struct employee *e2 = (struct employee *)s2; int gendercompare = strcmp(e1->gender, e2->gender); if (gendercompare == 0) /* same gender so sort by id */ return e1->id - e2->id; else return -gendercompare; /* the minus puts "male" first as in the question */ } 

然后使用标准库中的qsort。

 qsort(data, count, sizeof(struct employee), compare); 

在比较函数中你可能想要检查id是否相等,然后你可以按名称排序(也可以使用strcmp() )但是你喜欢。

编辑:刚刚编译并修复了这个问题。 这是一个小测试程序

  #include  #include  struct employee{ char gender[13]; char name[13]; int id; }; int compare(const void *s1, const void *s2) { struct employee *e1 = (struct employee *)s1; struct employee *e2 = (struct employee *)s2; int gendercompare = strcmp(e1->gender, e2->gender); if (gendercompare == 0) /* same gender so sort by id */ return e1->id - e2->id; else return -gendercompare; } main() { int i; struct employee info[]={{"male","Matt",1234},{"female","Jessica",2345},{"male","Josh",1235}}; for (i = 0; i < 3; ++i) printf("%d\t%s\t%s\n", info[i].id, info[i].gender, info[i].name); qsort(info, 3, sizeof(struct employee), compare); for (i = 0; i < 3; ++i) printf("%d\t%s\t%s\n", info[i].id, info[i].gender, info[i].name); } 

带输出:

 $ ./a.exe 1234 male Matt 2345 female Jessica 1235 male Josh 1234 male Matt 1235 male Josh 2345 female Jessica 

在struct数组上使用您喜欢的排序算法。 比较数组的两个元素以决定哪个是“更大”,比较它们的性别; 如果性别相同,则比较他们的数字。 (您可能需要定义一个单独的函数来进行此比较,以使事情更清楚。)然后,使用所需的格式按顺序打印已排序的数组。 跟踪性别从男性切换到女性的时间,以便您可以添加额外的三个换行符,如您的示例所示。

编辑:从kallikak无耻地借用,你可以将你的比较函数传递给qsort,但是如果一个结构是“更大”则返回1,如果它是“更少”则返回-1,如果是“更小”则返回0,如果相同则返回0 (使用我上面概述的程序)。 看看如何从stdlib为qsort编写比较函数? 有关编写自定义比较function的帮助。

认为它更容易理解,因为我指针很弱,希望它有帮助…………

 #include using namespace std; struct employee{ char gender[13]; char name[13]; int id; }; bool compare(employee s1,employee s2) { return s1.id