我的代码是只用一个字段对结构进行排序。
奇怪的是,当长度为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时,它可以正常工作。
答案 0 :(得分:4)
你的意思是&#34;长度&#34;?
这段代码非常令人困惑。您需要对您使用了多少元素有一个明确定义的概念,并在任何地方使用相同的元素。提示:它不应该是字面数字。
另外,你的比较函数是错误的,它需要为小于,等于或大于的元素返回-1,0或1。你的函数只会返回0或1。
答案 1 :(得分: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;
}
答案 2 :(得分:0)
请仔细阅读 几次qsort man page。在Linux上,键入man qsort
。
如果使用GCC,请将-Wall -g
传递给gcc
,以获取警告和调试信息。 (使用其他编译器,启用所有警告和调试信息)。
在malloc
之后,您最好使用memset
清除整个区域。实际上,您应该使用calloc
之类的
a = calloc (10, sizeof(*a));
if (!a)
perror("calloc a"), exit(EXIT_FAILURE);
回想一下始终应该测试 calloc
或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;
}
请学习使用调试器(如Linux上的gdb
)。