我正在尝试使用qsort
对结构数组进行排序。我有一个看起来像这样的结构:排序绑定结构元素
typedef struct {
double score;
int player_num;
} player_t;
而且我已经创建了一个结构数组的六名球员是这样的:
player_t *players = malloc(6 * sizeof(player_t));
,我来自这两个数组插入如果数据:
int player_numbers[] = {1, 2, 3, 4, 5, 6};
double scores[] = {0.765, 0.454, 0.454, 0.345, 0.643, 0.532};
到目前为止,我正在尝试按照分数对这个结构数组进行排序,如果分数中有关系,那么必须对玩家数进行排序。我迄今为止得到这个输出,从排序分数:
Player 1: Score: 0.765
Player 5: Score: 0.643
Player 6: Score: 0.532
Player 3: Score: 0.454
Player 2: Score: 0.454
Player 4: Score: 0.345
当我我真正想要的是这样的:
Player 1: Score: 0.765
Player 5: Score: 0.643
Player 6: Score: 0.532
Player 2: Score: 0.454
Player 3: Score: 0.454
Player 4: Score: 0.345
借助于此Player 2
和Player 3
互换位置,因为他们有相同的分数,所以他们各自的球员号码被排序。阵列的其余部分保持不变。
我到目前为止只是根据得分本身对结构阵列进行了排序,这些结果产生了第一个输出。我的代码如下所示:
#include <stdio.h>
#include <stdlib.h>
#define SIZE 6
int scorecmp(const void *a, const void *b);
typedef struct {
double score;
int player_num;
} player_t;
int
main(int argc, char *argv[]) {
int i;
int player_numbers[] = {1, 2, 3, 4, 5, 6};
double scores[] = {0.765, 0.454, 0.454, 0.345, 0.643, 0.532};
player_t *players = malloc(SIZE * sizeof(player_t));
for (i = 0; i < SIZE; i++) {
players[i].score = scores[i];
players[i].player_num = player_numbers[i];
}
qsort(players, SIZE, sizeof(*players), scorecmp);
for (i = 0; i < SIZE; i++) {
printf("Player %d: Score: %.3f\n", players[i].player_num, players[i].score);
}
free(players);
return 0;
}
int
scorecmp(const void *x, const void *y) {
if ((*(double*)x > *(double*)y)) {
return -1;
}
if ((*(double*)x < *(double*)y)) {
return +1;
}
return 0;
}
有没有什么方法可以让我第二次排序并列scores
,从使用player_num
代替,并产生第二所需的输出?
任何帮助,将不胜感激。
at'scorecmp':'return 0;' - >'return(((player_t *)x) - > player_num>((player_t *)y) - > player_num) - ((player_t *)x) - > player_num <((player_t *)y) - > player_num);' – BLUEPIXY
@BLUEPIXY请不要张贴hacky答案作为评论。 – user694733
你可以把它放在答案@BLUEPIXY中吗? – RoadRunner