gpt4 book ai didi

c - 如何将 qsort() 函数与该结构一起使用?

转载 作者:行者123 更新时间:2023-11-30 16:48:08 24 4
gpt4 key购买 nike

我有这些结构,

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

我做错了什么吗?

最佳答案

在为内置排序函数编写比较函数时,传入的参数实际上应该是 const void * 而不是任何其他类型。请参阅文档。

我不知道该结构中“容量”和“大小”之间的区别,但是当您在 qsort 中使用大小变量时,我会做同样的事情。

以下比较器在 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.

请注意,排在第一位的字符串中有一个空格。 :-)

关于c - 如何将 qsort() 函数与该结构一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43079308/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com