我有这些结构,
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
答案 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;
}