【问题标题】:How to quick sort an array of pointers to structures in C?如何快速排序指向 C 中结构的指针数组?
【发布时间】: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-&gt;occurrences 未定义,main 不完整,compare 声明为时已晚。它应该在最后打印节点。最终使用- 作为比较运算符是没有意义的,但我不知道这是一个错误还是故意的。请修复代码,以便编译并演示问题。
  • @Schwern 道歉,这更像是为了展示我的问题,而不是一个工作程序。它现在可以正确编译。 :)
  • @user3420034 我对-的错误。

标签: c arrays sorting quicksort


【解决方案1】:

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

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

【讨论】:

  • 我刚刚尝试了这两个建议,但都导致排序完全没有效果。我添加了 printf 代码来明确显示问题。 :)
【解决方案2】:

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

相应地投射。

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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-18
    • 1970-01-01
    • 2020-06-05
    • 1970-01-01
    • 2021-09-20
    • 2011-02-01
    相关资源
    最近更新 更多