如何消除结构中的重复项,并使用 qsort 在 C 中对它们进行排序
How to eliminate duplicates in a struct, and use qsort to sort them in C
我试图在我的结构中找到来自特定国家/地区的人员,消除重复项并使用 qsort 对团队和名称后的剩余部分进行排序。
我的结构如下:
struct rider_info{
char race_name[30];
char name[50];
char lastname[30];
int age;
char team[4];
char country[4];
};
所以我读入我的结构的文件中的一些人出现在多个种族中。因此,我需要消除重复项,但我不确定这是如何完成的。然后我需要在团队和名字之后用 qsort 对这些人进行排序。我试过了,但它只打印了我需要的那个特定国家的所有人。这是此时的代码:
void print_belgian_riders(FILE *fp, int j, rider_info person[j]) {
char str[4] = "BEL"; //i need to print Belgian riders
char line[128];
int lines = count_lines();
for (j = 0; j < lines; ++j) {
if (strcmp(person[j].country, str) == 0) {
qsort(person, 20, sizeof(person), struct_comp_team);
printf("%s %s %d %s %s ",
person[j].name,
person[j].lastname,
person[j].age,
person[j].team,
person[j].country);
printf("\n");
}
}
}
这里是我的比较函数,用于按团队和名称排序:
int struct_comp_team(const void *ep1, const void *ep2) {
int TeamSort = strcmp((((rider_info*)ep1)->team), ((rider_info*)ep2)->team);
int lastNameSort = strcmp(((rider_info*)ep1)->lastname, ((rider_info*)ep2)->lastname);
if (TeamSort != 0) {
return (TeamSort);
}
else if (lastNameSort != 0) {
return lastNameSort;
}
}
我的比较功能不工作,我不确定它有什么问题,有人知道如何做吗?还有人知道我应该如何消除重复项吗?
根据 mch
建议修改您的比较函数。
int struct_comp_team(const void *ep1, const void *ep2) {
int TeamSort = strcmp((((rider_info*)ep1)->team), ((rider_info*)ep2)->team);
int lastNameSort = strcmp(((rider_info*)ep1)->lastname, ((rider_info*)ep2)->lastname);
if (TeamSort != 0) {
return (TeamSort);
}
else if (lastNameSort != 0) {
return lastNameSort;
}
return 0;//duplicate value
}
我试图在我的结构中找到来自特定国家/地区的人员,消除重复项并使用 qsort 对团队和名称后的剩余部分进行排序。
我的结构如下:
struct rider_info{
char race_name[30];
char name[50];
char lastname[30];
int age;
char team[4];
char country[4];
};
所以我读入我的结构的文件中的一些人出现在多个种族中。因此,我需要消除重复项,但我不确定这是如何完成的。然后我需要在团队和名字之后用 qsort 对这些人进行排序。我试过了,但它只打印了我需要的那个特定国家的所有人。这是此时的代码:
void print_belgian_riders(FILE *fp, int j, rider_info person[j]) {
char str[4] = "BEL"; //i need to print Belgian riders
char line[128];
int lines = count_lines();
for (j = 0; j < lines; ++j) {
if (strcmp(person[j].country, str) == 0) {
qsort(person, 20, sizeof(person), struct_comp_team);
printf("%s %s %d %s %s ",
person[j].name,
person[j].lastname,
person[j].age,
person[j].team,
person[j].country);
printf("\n");
}
}
}
这里是我的比较函数,用于按团队和名称排序:
int struct_comp_team(const void *ep1, const void *ep2) {
int TeamSort = strcmp((((rider_info*)ep1)->team), ((rider_info*)ep2)->team);
int lastNameSort = strcmp(((rider_info*)ep1)->lastname, ((rider_info*)ep2)->lastname);
if (TeamSort != 0) {
return (TeamSort);
}
else if (lastNameSort != 0) {
return lastNameSort;
}
}
我的比较功能不工作,我不确定它有什么问题,有人知道如何做吗?还有人知道我应该如何消除重复项吗?
根据 mch
建议修改您的比较函数。
int struct_comp_team(const void *ep1, const void *ep2) {
int TeamSort = strcmp((((rider_info*)ep1)->team), ((rider_info*)ep2)->team);
int lastNameSort = strcmp(((rider_info*)ep1)->lastname, ((rider_info*)ep2)->lastname);
if (TeamSort != 0) {
return (TeamSort);
}
else if (lastNameSort != 0) {
return lastNameSort;
}
return 0;//duplicate value
}