2016-11-30 13 views
0

qsortを使って構造体の配列をソートしようとしています。しかし、私はcompare関数の作り方を理解することに問題があります。私は次の構造体を持っています:構造体の配列を並べ替えるための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 
+0

何をして働いていないのですか? –

+0

@EliSadoffそれは単にそれをソートするのではありません。あなたが見ることができるように出力を追加する。 – asdasd

+0

Fyiの場合、ソートを大きくするにはコンパレータのロジックを逆にする必要があります。 'qsort'は、否定的な結果が「より小さい」を意味し、ゼロは等価を意味し、「正」は「より大きい」を意味すると予測する。そして、昇順で並べ替えます。だから、もっと大きいLHSはRHSよりも小さく、実際にはRHSより小さく、あなたが望む順番でソートするはずです。 – WhozCraig

答えて

4

あなたqsort()呼び出しが間違っている:

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

3番目の引数は、各要素のアレイののサイズでなければなりません。 teamが宣言されているかどうかに応じて、代わりに配列全体のサイズかポインタのサイズを渡しています。あなたが欲しい:

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

はまた、あなたの比較関数は、わずかにそれを返すこと-1ときp1->points == p2->pointsで欠陥があります。 pointsメンバーをソートしているように見えるので、2つのチームが同じポイント数を持つ場合、比較関数は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 

See it live here.