[英]How can I use the qsort() function with this struct?
我有这些结构,
typedef struct
{
char *str; //register to store each element (one string)
} v_elemento;
/**
* this register has an array of elements, a counter for the size and another for the capacity
*/
typedef struct
{
/** numero de elementos do vetor */
int tamanho; //size
/** capacidade do vetor */
int capacidade; //capacity
/** array of stored elements */
v_elemento* elementos;
} vetor;
我听说有一个qsort()函数可以对数组进行排序,我尝试检查互联网,但是所有示例都使用int,float或string。 如何使用上述结构使用qsort()函数?
我想要这样的东西
for(int i=0; i<vetor->tamanho;i++)
//sorts vetor->elemento[i].str
这是我的cmp函数;
int compara(v_elemento *p0,v_elemento *p1){
return strcmp(p0->str,p1->str);
}
这是我的qsort()函数:
qsort(vec->elementos,vec->tamanho, sizeof(v_elemento),compara)
我要向您展示一个代码,该代码可以正常运行,可以对我想要的内容进行排序,但可以进行选择:
int vetor_ordena_sel(vetor* vec)
{
//special cases
if(vec==NULL)
return -1;
if(vec->tamanho<=1) // already sorted
return 0;
// special cases
int i, j, posicao; //posicao is position
char *min_tmp;
for(i=0;i<(vec->tamanho);i++){
posicao=i;
for(j=i+1;j<(vec->tamanho);j++){
if(strcmp(vec->elementos[j].str,vec->elementos[posicao].str)<0)
posicao=j;
}
if(posicao!=i){
min_tmp=vec->elementos[i].str;
vec->elementos[i].str=vec->elementos[posicao].str;
vec->elementos[posicao].str=min_tmp;
}
}
return 0;
}
难道我做错了什么?
为内置排序函数编写比较函数时,传入参数实际上应为const void *
而不是任何其他类型。 请参考文档。
我不知道该结构中“容量”和“大小”之间的区别,但是当您在qsort中使用size变量时,我会做同样的事情。
以下比较器在gcc 4.2.1下工作。
int compara(const void *p0, const void *p1)
{
return strcmp(((v_elemento *)p0)->str, ((v_elemento *)p1)->str);
}
就像我在上面说的那样,您只能传递const void *
,所以我进行了类型转换。
以下是我编写的驱动程序代码:
// Test case.
vetor *vec = malloc(sizeof(vetor));
vec->tamanho = 5;
vec->elementos = malloc(5 * sizeof(v_elemento));
vec->elementos[0].str = "This";
vec->elementos[1].str = "is";
vec->elementos[2].str = "a";
vec->elementos[3].str = " test";
vec->elementos[4].str = "string.";
// Sort.
qsort(vec->elementos, vec->tamanho, sizeof(v_elemento), compara);
// Print result.
for (int i = 0; i < 5; ++i) {
printf("%s\n", vec->elementos[i].str);
}
// Clean up.
free(vec->elementos);
free(vec);
输出结果为:
test
This
a
is
string.
请注意,字符串中有一个空格排在第一位。 :-)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.