如何快速排序C中结构的指针数组?

时间:2015-12-08 19:51:54

标签: c arrays sorting quicksort

因此,有许多使用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个元素。但似乎忽略了这一点。

有什么想法导致这种奇怪的行为?

2 个答案:

答案 0 :(得分:4)

当你将*myArray作为第一个参数传递给qsort函数时,就像传递myArray[0]一样,这肯定不是正确的指针(并且会导致未定义的行为并且很可能是一些奇怪的行为,比如排序“垃圾”数据。)

使用普通myArray让数组衰减到指向第一个元素的指针,或使用&myArray[0]显式指定第一个元素。

答案 1 :(得分:1)

Joachim has solved one problem,还有另一个。 qsort指针传递给compare 的数组元素,即使它们已经是指针。所以compare得到Node **,一个双指针。如果您在node->value内打印compare,则可以看到此内容。

相应地施展。

static int compare(const void *p1, const void *p2)
{
    const Node *node1 = *(const Node **)p1;
    const Node *node2 = *(const Node **)p2;

    printf("cmp %d %d\n", node1->value, node2->value);
    return node1->value - node2->value;
}