如何使用qsort()订购此结构?

时间:2017-03-29 17:28:32

标签: c

我有这些结构,

 typedef struct
{
  int votos; //Votes
  float classifica; //Rating
  char* titulo; //Title
  int ano;     //Year
} vg_elemento;

/**
* this register has a vetorg of elements a counter for the size and a counter for the capacity  
*/
typedef struct
{
  /** numero de elementos do vetorg */
  int tamanho;       //size

  /** capacidade do vetorg */
  int capacidade; //capacity

  /** array of stored elements */
  vg_elemento* elementos;

} vetorg;

我听说有一个qsort()函数允许我对数组进行排序,我尝试检查互联网,但所有示例都使用int,float或strings。如何使用上面的结构使用qsort()函数?

我有一些比较函数,已经给出了:

 typedef int (*comp)(const vg_elemento a, const vg_elemento b);

int comp_ano_asc(const vg_elemento a, const vg_elemento b){ //sorts bt year
    if(b.ano > a.ano)
        return -1;
    if(a.ano > b.ano)
        return 1;
    return 0;
}

int comp_votos_asc(const vg_elemento a, const vg_elemento b) //sorts by votes
{
    if(b.votos > a.votos)
        return -1;
    if(a.votos > b.votos)
        return 1;
    return 0;
}

int comp_classifica_asc(const vg_elemento a, const vg_elemento b) //sorts by rating
{
    if(b.classifica > a.classifica)
        return -1;
    if(a.classifica > b.classifica)
        return 1;
    return 0;
}

int comp_titulo_asc(const vg_elemento a, const vg_elemento b) //sorts by title (alphabetically)
{
    if(strcmp(b.titulo,a.titulo)>0)
        return -1;
    if(strcmp(a.titulo,b.titulo)>0)
        return 1;
    return 0;
}

我想使用函数对数组进行排序,在该函数中调用qsort()。例如:

    int vetorg_ordena(vetorg* vec, comp ordem){

    //sorts the array according to ordem in an ascending order. returns 0, if successful
}

以下是大小为3的示例数组的示例:

Votes Rating Year Title
319656 8.8 2010 Inception
511125 8.8 2008 The Dark Knight
227431 8.3 1983 Star Wars: Episode VI - Return of the Jedi

1 个答案:

答案 0 :(得分:2)

如果您阅读例如this qsort reference你会看到比较函数传递了指针。它获得的指针是指向要排序的数组中元素的指针。

所以如果你有一个像vg_elemento那样的数组

vg_elemento videos[SOME_SIZE];

然后比较函数基本上称为

comp(&videos[i], &videos[j]);

反过来意味着你的功能看起来像

int comp_ano_asc(const void *a, const void *b){ //sorts bt year
    const vg_elemento *va = (vg_elemento *) a;
    const vg_elemento *vb = (vg_elemento *) b;

    if(vb->ano > va->ano)
        return -1;
    if(ba->ano > vb->ano)
        return 1;
    return 0;
}