关于排序:如何消除结构中的重复项,并使用qsort在C中对它们进行排序

How to eliminate duplicates in a struct, and use qsort to sort them in C

我试图在我的结构中找到来自特定国家的人,消除重复项,并用qsort将剩余的按团队和名称排序。

我的结构如下:

1
2
3
4
5
6
7
8
struct rider_info{
  char race_name[30];
  char name[50];
  char lastname[30];
  int age;
  char team[4];
  char country[4];
  };

所以我正在读取的文件中的一些人出现在多个种族中。因此,我需要消除重复,但我不确定是如何做到的。之后,我需要将这些人按团队和名称进行排序。我已经尝试过了,但它只是打印了我需要的那个特定国家的所有人。这是目前的代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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("
"
);

      }

   }
}

下面是我的比较功能,用于按团队和名称排序:

1
2
3
4
5
6
7
8
9
10
11
12
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建议修改比较函数。

1
2
3
4
5
6
7
8
9
10
11
12
13
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
}