有没有办法在 C 中按多个变量对结构进行排序? [英] Is there a way to sort structs by multiple variables in C?
本文介绍了有没有办法在 C 中按多个变量对结构进行排序?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
我必须编写一个函数来对数组中的结构进行排序.结构是:
I have to write a function that sorts structs in an array. the struct is:
#define MAX_USERNAME_LENGTH 16
typedef struct{
char username[MAX_USERNAME_LENGTH];
unsigned int rides;
unsigned int rank;
} driver;
程序从 .txt 文件加载数据并填充数组
The program load the data from a .txt file and fills an array
driver driver_list[256]
我必须按排名和乘车次数对 driver_list 进行排序.所以如果我的文件包含
I have to sort driver_list by ranks AND number of rides. So if my file contains
//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 个嵌套进行选择排序,但在输出中我看到列表仅按排名或行程排序.感谢帮助
There's a way to do that? I've tried selection sort with 2 nested for, but in output i see the list sorted only by rank OR rides. Thanks for help
推荐答案
使用标头
中声明的标准函数qsort
并编写用户-定义的比较函数.
Use the standard function qsort
declared in the header <stdlib.h>
and write a user-defined comparison function.
给你.
#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
这篇关于有没有办法在 C 中按多个变量对结构进行排序?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文