0

我的代码是仅按一个字段对结构进行排序。

奇怪的是,当长度为 8 而不是 9 时它可以工作。为什么会这样,有什么问题?

struct node
{
   int key;//I need to sort by the key
   int val;
};
int comp(const void *a, const void *b)
{
return ((struct node *)a)->key > ((struct node *)b)->key;
}
int main()
{
    int i;
    struct node *a;
    a = malloc(10 * sizeof *a);
    /*I have 8 elements*/
    for (i = 0; i < 6; i++)
         a[i].key = 22;
    a[6].key = 21;
    a[7].key = 20;
    a[8].key = 10;
    /*Before sorting, I print it first*/
    for (i = 0; i < 9; i++)
    printf("%3d", a[i].key);
    printf("\n");
    qsort(a, 9, sizeof(struct node), comp);
    /*The sorted answer*/
    for (i = 0; i < 9; i++)
       printf("%3d", a[i].key);
    printf("\n");
    free(a);
    return 0;
}

输出是:

22 22 22 22 22 22 21 20 10

10 22 22 22 22 22 21 20 22

但是当我将长度更改为 8 时,它可以工作。

4

3 回答 3

4

“长度”是什么意思?

  • 您为 10 个元素分配空间。
  • 你对其中的 9 个进行排序。
  • 您打印其中的 9 个。

这段代码非常混乱。您需要对正在使用的元素数量有一个明确定义的想法,并且在任何地方都使用相同的元素。提示:它不应该是文字数字。

此外,您的比较函数是错误的,它需要分别为小于、等于或大于的元素返回 -1、0 或 1。您的函数只会返回 0 或 1。

于 2012-10-19T13:44:51.063 回答
2

根据两个参数的关系,您的比较应该返回一个小于、等于或大于零的值。例如:

int comp(const void *a, const void *b)
{
  int key_a = ((struct node *)a)->key;
  int key_b = ((struct node *)b)->key;
  if (key_a<key_b) return -1;
  if (key_a>key_b) return 1;
  return 0;
}
于 2012-10-19T13:44:44.323 回答
0

仔细阅读qsort 手册页数次。在 Linux 上,键入man qsort. 如果使用 GCC,请通过传递-Wall -ggcc. (使用另一个编译器,启用所有警告和调试信息)。

之后,malloc您最好使用 清除整个区域memset。实际上,您应该使用calloclike

a = calloc (10, sizeof(*a));
if (!a) 
  perror("calloc a"), exit(EXIT_FAILURE);

回想一下,您总是应该测试callocor的结果malloc

比较器函数获取要比较的东西的地址,并且应该返回一个整数(0 表示相等,负数表示小于,正数表示大于)。

int comp(const void *a, const void *b)
{
   const struct node* na = (const struct node*) a;
   const struct node* nb = (const struct node*) b;
   return na->key - nb->key;
}

请学习使用调试器(如gdb在 Linux 上)。

于 2012-10-19T13:50:01.297 回答