【发布时间】:2017-03-28 20:27:10
【问题描述】:
我有这些结构,
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 或字符串。如何使用上述结构使用 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;
}
我做错了吗?
【问题讨论】:
-
您要对哪个数组进行排序?您的代码不包含任何数组,只有两种类型。
-
只要您提供适当的比较功能,您就可以在任何您想要的地方使用它。
-
我已经编辑了我的原始帖子,它现在显示了我想要排序的内容。
-
qsort()的实际文档——例如here——将是一个很好的起点。请注意,参数依次是指向数组第一个元素的指针、数组中元素的数量、每个元素的大小以及指向用于比较元素的比较函数的指针。无论数组元素的类型如何,它的工作方式都完全相同(请参阅您找到的示例以获得指导);您只需要确保提供适合该类型的比较函数。 -
vetor->elemento[i].str是一个字符指针,可能指向一个字符串。那是你想要排序的吗?您想对字符串进行排序吗?
标签: c