C中的qsort(动态分配)

时间:2016-07-09 14:36:38

标签: c arrays pointers qsort

我想知道这种情况。

当我定义这句话时

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 

3 个答案:

答案 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 ;
}

注意:他们说you shouldn't cast the result of malloc() in C

答案 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