簡體   English   中英

Qsort對結構數組進行排序

[英]Qsort to sort array of structs

我正在嘗試使用qsort對結構數組進行排序。 但是我在理解如何進行比較功能時遇到問題。 我有以下結構:

typedef struct {
  char name[TEAM_SIZE];
  int points;
} TEAM;

我正在嘗試按照最高得分的先后順序對每支球隊進行排序。

qsort(team, NUMBER_OF_TEAMS, sizeof(team), compare_points);

和比較功能:

int compare_points(const void *a, const void *b) {
  TEAM *p1 = (TEAM *)a;
  TEAM *p2 = (TEAM *)b;

  if(p1->points < p2->points) {
    return 1;
  }
  else {
    return -1;
  }
}

你會怎么做?

輸出:

Before:FCN 38
Before:FCM 59
Before:OB 46
Before:AGF 37
Before:AAB 50
Before:FCK 71
Before:HOB 18
Before:SDR 62
Before:RFC 47
Before:BIF 54
Before:EFB 30
Before:VFF 40
After:FCM 59
After 8
After:OB 46
After:AGF 37
After:AAB 50
After:FCK 71
After:HOB 18
After:SDR 62
After:RFC 47
After:BIF 54
After:EFB 30
After:VFF 40

您的qsort()調用是錯誤的:

 qsort(team, NUMBER_OF_TEAMS, sizeof(team), compare_points); 

第三個參數必須是數組每個元素的大小。 你是路過,而不是整個陣列的規模或指針的大小,取決於如何team聲明。 你要:

qsort(team, NUMBER_OF_TEAMS, sizeof(TEAM), compare_points);

另外,您的比較函數有一點缺陷,即當p1->points == p2->points時,它返回-1。 由於您似乎要對points成員進行排序,所以當兩個團隊的得分相同時,您的比較函數應返回0。

#include <stdio.h>
#include <stdlib.h>

#define TEAM_SIZE 10

typedef struct {
    char name[TEAM_SIZE];
    int points;
} TEAM;


int compare_points(const void *a, const void *b)
{
    const TEAM *p1 = a;
    const TEAM *p2 = b;
    return p2->points < p1->points ? -1 : p1->points < p2->points;
}

int main()
{
    TEAM teams[] =
    {
        { "OB",  46 }, { "AGF", 37 },
        { "AAB", 50 }, { "FCK", 71 },
        { "HOB", 18 }, { "SDR", 62 },
        { "RFC", 47 }, { "BIF", 54 },
        { "EFB", 30 }, { "VFF", 40 }
    };

    size_t NUM_TEAMS = sizeof teams / sizeof *teams;

    qsort(teams, NUM_TEAMS, sizeof(TEAM), compare_points);

    for (size_t i=0; i< NUM_TEAMS; ++i)
        printf("%s : %d\n", teams[i].name, teams[i].points);

    return 0;
}

產量

FCK : 71
SDR : 62
BIF : 54
AAB : 50
RFC : 47
OB : 46
VFF : 40
AGF : 37
EFB : 30
HOB : 18

看到它住在這里

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM