【问题标题】:How can I use the qsort() function with this struct?我如何在这个结构中使用 qsort() 函数?
【发布时间】: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-&gt;elemento[i].str 是一个字符指针,可能指向一个字符串。那是你想要排序的吗?您想对字符串进行排序吗?

标签: c


【解决方案1】:

在为内置排序函数编写比较函数时,传入参数实际上应该是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.

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

【讨论】:

  • 它为我解决了这个问题。我很感激!谢谢!
猜你喜欢
  • 2021-05-08
  • 1970-01-01
  • 1970-01-01
  • 2016-09-02
  • 2017-08-23
  • 2018-01-04
  • 2022-01-01
  • 2018-02-21
  • 1970-01-01
相关资源
最近更新 更多