如何在C中按降序对结构数组排序

问题描述 投票:0回答:2

这些是我的结构:

struct create{
    char names[30];
    int Win;
    int Lose;
    int Draw;
    int Points;
    int Average;
    int Goals;
};

所以,我正在寻找一种方法,以降序对它们进行排序。就像,根据int Win,如果Win高于其他,则应该位于顶部。

例如:

Name - Win - Lose - Draw ...
Joe  -  2  -   0  -  0 ...
Bill -  1  -   0  -  1 ...
Mike -  0  -   1  -  1 ...

有可能吗?有人可以帮我这个忙。

c function structure qsort
2个回答
0
投票

典型的排序看起来像:

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

struct create {
    char *name;
    int Win;
    int Lose;
    int Draw;
    int Points;
    int Average;
    int Goals;
};

int
comp(const void *va, const void *vb)
{
        const struct create *a = va;
        const struct create *b = vb;
        return a->Win > b->Win;
}

int
main(void)
{
        struct create a = { .name = "a", .Win = 5 };
        struct create b = { .name = "b", .Win = 7 };
        struct create c = { .name = "c", .Win = 3 };
        struct create *ar[] = { &a, &b, &c };
        qsort(ar, sizeof ar / sizeof *ar, sizeof *ar, comp);
        for( unsigned i = 0; i < sizeof ar / sizeof *ar; i++ ) {
                printf(" %s: %d\n", ar[i]->name, ar[i]->Win);
        }

        return 0;
}

0
投票

使用在标题qsort中声明的标准C函数<stdlib.h>创建适当的比较函数。

您在这里。

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

struct create{
    char names[30];
    int Win;
    int Lose;
    int Draw;
    int Points;
    int Average;
    int Goals;
};

int cmp( const void *a, const void *b )
{
    const struct create *left  = a;
    const struct create *right = b;

    return ( left->Win < right->Win ) - ( right->Win < left->Win );  
}

int main(void) 
{
    struct create a[] =
    {
        { .names = "Mike", .Win = 0, .Lose = 1, .Draw = 1 },
        { .names = "Joe",  .Win = 2, .Lose = 0, .Draw = 0 },
        { .names = "Bill", .Win = 1, .Lose = 0, .Draw = 1 },
    };

    const size_t N = sizeof( a ) / sizeof( *a );

    for ( size_t i = 0; i < N; i++ )
    {
        printf( "%-4s %d %d %d\n", a[i].names, a[i].Win, a[i].Lose, a[i].Draw );
    }

    putchar( '\n' );

    qsort( a, N, sizeof( struct create ), cmp );

    for ( size_t i = 0; i < N; i++ )
    {
        printf( "%-4s %d %d %d\n", a[i].names, a[i].Win, a[i].Lose, a[i].Draw );
    }

    putchar( '\n' );

    return 0;
}

程序输出为

Mike 0 1 1
Joe  2 0 0
Bill 1 0 1

Joe  2 0 0
Bill 1 0 1
Mike 0 1 1
© www.soinside.com 2019 - 2024. All rights reserved.