有没有一种方法可以用C中的多个变量对结构进行排序?

时间:2019-08-24 12:15:08

标签: c sorting struct structure qsort

我必须编写一个对数组中的结构进行排序的函数。结构是:

#define MAX_USERNAME_LENGTH 16

typedef struct{
 char username[MAX_USERNAME_LENGTH];
 unsigned int rides;
 unsigned int rank;
} driver;

程序从.txt文件加载数据并填充数组

driver driver_list[256]

我必须按等级和乘车次数对driver_list进行排序。因此,如果我的文件包含

//user rides rank
frank209 3 6
john76 7 6
harry99 2 2
bob77 5 2

输出必须显示:

john76 7 6
frank209 3 6
bob77 5 2
harry99 2 2

有办法做到吗?我试过嵌套2的选择排序,但在输出中我看到列表仅按等级或游乐设施排序。 感谢您的帮助

2 个答案:

答案 0 :(得分:1)

使用标头qsort中声明的标准函数<stdlib.h>并编写用户定义的比较函数。

您在这里。

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

#define MAX_USERNAME_LENGTH 10

typedef struct
{
    char username[MAX_USERNAME_LENGTH];
    unsigned int rides;
    unsigned int rank;
} driver;

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

    if ( b->rank < a->rank )
    {
        return -1;
    }
    else if ( a->rank < b->rank )
    {
        return 1;
    }
    else
    {
        return  (  a->rides < b->rides ) - ( b->rides < a->rides );
    }
}


int main(void) 
{
    enum { N = 4 };
    driver driver_list[N] =
    {
        { "frank209", 3, 6 }, 
        { "john76", 7, 6 }, 
        { "harry99", 2, 2 }, 
        { "bob77", 5, 2 }   
    };

    qsort( driver_list, N, sizeof( driver ), cmp );

    for ( size_t i = 0; i < N; i++ )
    {
        printf( "%s, %u, %u\n", 
                driver_list[i].username, driver_list[i].rides, driver_list[i].rank );
    }

    return 0;
}

程序输出为

john76, 7, 6
frank209, 3, 6
bob77, 5, 2
harry99, 2, 2

答案 1 :(得分:0)

这里的一个关键概念是,一条记录在另一条记录之前是什么意思。而不是将其视为排序算法的功能-排序的结构如何使其可以按多个字段进行排序-而是记录之间关系的功能。您将只有一个常规的排序算法,但是其排序顺序中“较早”的标准使用记录的两个字段。如果记录的排名更高,或者如果排名相同,则记录被确定在另一个记录之前。

一旦您知道“之前”的含义,您便具有订购关系。然后,任何排序方法都可以。您只需使用选择的顺序进行排序。

如果您使用的是C标准qsort,您将编写一个比较函数:

  • 获取指向const void的指针,这是由于qsort接口所必需。
  • 将这些指针转换为指向您的结构的指针。
  • 如果第一个结构的排名大于第二个结构,则返回负值(表示“更早”)。如果排名较低,则返回正值(“更高”)
  • 否则,等级是相等的。如果第一个结构有更多游乐设施,请返回负值。如果数量较少,则返回正数。如果它们相同,则返回零。

如果您要编写自己的排序,则仍然使用上面的比较过程。