【发布时间】:2015-12-08 19:51:54
【问题描述】:
因此,有很多将qsort() 与结构、指针等结合使用的示例。但在我的实现中,它们似乎都没有正确排序。
这是我的代码的概述:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct node {
int value;
};
typedef struct node Node;
int compare(const void *p1, const void *p2);
int main()
{
Node *myArray[10];
Node *node1, *node2, *node3;
int i;
node1 = (Node *)malloc(sizeof(Node));
node1->value = 10;
myArray[0] = node1;
node2 = (Node *)malloc(sizeof(Node));
node2->value = 7;
myArray[1] = node2;
node3 = (Node *)malloc(sizeof(Node));
node3->value = 12;
myArray[2] = node3;
for (i=0; i<3; i++) {
printf("Element %i: %i\n", i, myArray[i]->value);
}
printf("-------------\n");
qsort(myArray, 3, sizeof(Node*), compare);
for (i=0; i<3; i++) {
printf("Element %i: %i\n", i, myArray[i]->value);
}
return 0;
}
int compare(const void *p1, const void *p2)
{
Node *node1 = (Node*) p1;
Node *node2 = (Node*) p2;
return node1->value - node2->value;
}
这段代码是为了演示我的问题,所以请不要对我的语义咆哮!数组中多余的未使用空间是有意的。 :p
据我所知,根据我在网上阅读的内容,这应该可行。但事实并非如此。由于某种原因,它开始在比较函数中对垃圾值进行排序。
我要求数组通常大于其中的值,因此希望 qsort() 函数的第二个参数在这种情况下将其限制为仅前 3 个元素。但它似乎忽略了这一点。
任何想法是什么导致了这种奇怪的行为?
【问题讨论】:
-
我认为 p1 不指向节点,而是指向数组元素,即指向节点的指针。您可能需要双重取消引用 p1 和 p2。
-
该代码无法编译。
-
您的代码无法编译。
node->occurrences未定义,main不完整,compare声明为时已晚。它应该在最后打印节点。最终使用-作为比较运算符是没有意义的,但我不知道这是一个错误还是故意的。请修复代码,以便编译并演示问题。 -
@Schwern 道歉,这更像是为了展示我的问题,而不是一个工作程序。它现在可以正确编译。 :)
-
@user3420034 我对
-的错误。
标签: c arrays sorting quicksort