【问题标题】:Sorting Array of Struct Pointers结构指针数组排序
【发布时间】:2013-07-22 08:19:17
【问题描述】:

我正在尝试使用qsort() 对结构数组进行排序,但令人沮丧的是,它不起作用。我已经阅读了qsort() 的手册页,并且我认为我的比较器函数在语法上看起来还不错,但是当我在调用qsort() 后打印“排序”数组时,我的数组中没有任何内容排序。

代码:

#include <stdlib.h>
#include <stdio.h>

#define ARRAY_SZ 5

typedef struct SingleChar
{
    unsigned char Character;
    unsigned int Weight;
} *SingleCharPtr;

int CompareWeights(const void *a, const void *b)
{
    const SingleCharPtr p1 = (SingleCharPtr)a;
    const SingleCharPtr p2 = (SingleCharPtr)b;

    // printf("Weight1: %u\tWeight2: %u\n", p1->Weight, p2->Weight);
    // return (p1->Weight - p2->Weight);

    if (p1->Weight < p2->Weight)
        return -1;
    else if (p1->Weight > p2->Weight)
        return 1;
    else
        return 0;
}


SingleCharPtr MakeChar(unsigned char c, unsigned int w)
{
    SingleCharPtr scptr = malloc(sizeof(struct SingleChar));

    if (!scptr)
    {
        fprintf(stderr, "[Error] Out of memory\n");
        exit(1);
    }

    scptr->Character = c;
    scptr->Weight = w;

    return scptr;
}

int main(void)
{
    SingleCharPtr *chars = malloc(ARRAY_SZ * sizeof(SingleCharPtr));

    chars[0] = MakeChar('B', 3);
    chars[1] = MakeChar('E', 7);
    chars[2] = MakeChar('A', 4);
    chars[3] = MakeChar('D', 6);
    chars[4] = MakeChar('C', 2);

    qsort(chars, ARRAY_SZ, sizeof(SingleCharPtr), &CompareWeights);

    int i;
    for (i = 0; i < ARRAY_SZ; i++)
    {
        printf("Character: %c\tWeight: %u\n", chars[i]->Character, chars[i]->Weight);
        free(chars[i]);
    }

    free(chars);

    return 0;
}

另外,在比较器函数 (CompareWeights()) 中,我发现当我打印 SingleCharPtr 指向的结构的权重时,我得到的都是 0。

任何指向正确方向的指针都将受到高度赞赏。

【问题讨论】:

  • 请不要发布代码的链接或截图。将其粘贴到此处并格式化。
  • @H2CO3,注意。谢谢!

标签: c pointers struct qsort


【解决方案1】:

问题:qsort()指针 传递给要与比较器函数进行比较的元素,而不是元素本身。所以,CompareWeights() 函数的参数实际上是const SingleCharPtr *,伪装成const void *。你应该在那个函数中做的是:

const SingleCharPtr p1 = *(const SingleCharPtr *)a;

等等


旁注:

我。如果你的假设成立,那么你就不需要演员表了:

const SingleCharPtr p1 = a;

优于

const SingleCharPtr p1 = (SingleCharPtr)a;

因为this

二。比较函数不需要返回-101。它应该返回一个小于 0、0 或大于 0 的整数。因此,CompareWeight() 中的所有巨大的if 完全是多余的,请写

return p1->Weight - p2->Weight;

改为。

三。 SingleCharPtr *chars = malloc(ARRAY_SZ * sizeof(SingleCharPtr)); - 为什么?您仅在 main() 函数中本地使用 chars 数组,您不需要为此进行动态分配。为什么不写

SingleCharPtr chars[ARRAY_SZ];

改为?

【讨论】:

  • 三。这是一个运行我正在创建的更大程序的测试程序。这就是我想在本地测试*chars 指针的原因。感谢您的回答和反馈。
【解决方案2】:

如果您在例如this manual page,您将看到当 qsort 被传递一个指针数组(就像您拥有的一样)时,排序函数的参数实际上是指向指针的指针。这是因为qsort 传递指向元素的指针,而不是元素本身。

为了适应这一点,请进行相应的更改:

int CompareWeights(const void *a, const void *b)
{
    const SingleCharPtr p1 = *(SingleCharPtr*)a;
    const SingleCharPtr p2 = *(SingleCharPtr*)b;

    return (p1->Weight - p2->Weight);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-02-25
    • 1970-01-01
    • 1970-01-01
    • 2014-07-04
    • 2021-06-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多