我想知道这种情况。
当我定义这句话时
struct soccer team[100] ;
我可以做qsort;
qsort(team, MAX , sizeof(team[0]) , compare) ;
int compare(const void *a, const void *b )
{
SOC *A1 = (SOC*)a ;
SOC *B1 = (SOC*)b ;
if( A1->score > B1->score )
return -1 ;
else if ( A1->score == B1->score )
return 0 ;
else
return 1 ;
}
当我进行动态分配时
struct soccer*team[MAX] ;
team[Index] = (SOC*)malloc(sizeof(SOC)) ;
错误已存在。 (qsort和比较相同)
我想知道如何使用它(qsort用于动态分配结构)
请!
示例(当我使用第一种方式时)
Man 3 1 1 16
Che 2 2 2 8
Asn 0 6 0 6
hot 6 0 0 18
City 0 0 6 0
Bar 1 5 0 8
已转换
hot 6 0 0 18
Man 3 1 1 16
Che 2 2 2 8
Bar 1 5 0 8
Asn 0 6 0 6
City 0 0 6 0
答案 0 :(得分:1)
第一个版本
struct soccer team[100] ;
和第二个
struct soccer*team[MAX] ;
team[Index] = (SOC*)malloc(sizeof(SOC)) ;
不一样。第一个是struct soccer
的数组,第二个是struct soccer *
的数组。它们不仅仅是一样的。
如果您想使用更高版本(包括指针)并获得与上述相同的行为,您可以执行类似
的操作struct soccer * team;
team = malloc(sizeof *team * SIZE) ; // SIZE is the number of elements
答案 1 :(得分:0)
相同的比较函数不能用于不同的元素类型。使用正确的比较函数(指向元素的指针,将是指针,因此取消引用它们以获取指向结构的指针):
int compare2(const void *a, const void *b )
{
SOC *A1 = *(SOC**)a ;
SOC *B1 = *(SOC**)b ;
if( A1->score > B1->score )
return -1 ;
else if ( A1->score == B1->score )
return 0 ;
else
return 1 ;
}
答案 2 :(得分:0)
这是一个演示程序,显示了如何对类似的数组进行排序。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define MAX 10
typedef struct soccer
{
unsigned int score;
} SOC;
int cmp( const void *a, const void *b )
{
const SOC *lhs = *( const SOC ** )a;
const SOC *rhs = *( const SOC ** )b;
return ( lhs->score > rhs->score ) - ( rhs->score > lhs->score );
}
int main( void )
{
SOC * team[MAX];
srand( ( unsigned int )time( NULL ) );
for ( int i = 0; i < MAX; i++ )
{
team[i] = malloc( sizeof( SOC ) );
team[i]->score = rand() % MAX;
}
for ( int i = 0; i < MAX; i++ )
{
printf( "%u ", team[i]->score );
}
printf( "\n" );
qsort( team, MAX, sizeof( SOC * ), cmp );
for ( int i = 0; i < MAX; i++ )
{
printf( "%u ", team[i]->score );
}
printf( "\n" );
for ( int i = 0; i < MAX; i++ ) free( team[i] );
return 0;
}
程序输出
2 7 2 5 1 6 1 5 0 4
0 1 1 2 2 4 5 5 6 7