簡體   English   中英

排序結構指針數組

[英]Sorting Array of Struct Pointers

我試圖使用qsort()排序結構數組但令人沮喪的是,它不起作用。 我已經閱讀了qsort()的聯機幫助頁,我認為我的比較器函數在語法上看起來還不錯,但是當我在調用qsort()之后打印“sorted”數組時,我的數組中沒有任何內容排序。

編碼:

#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。

任何指向正確方向的指針都將受到高度贊賞。

如果您在例如本手冊頁中看到示例,您將看到當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);
}

問題: qsort()傳遞指向要與比較器函數進行比較的元素的指針 ,而不是元素本身。 因此, CompareWeights()函數的參數實際上是const SingleCharPtr * ,偽裝成const void * 你應該在這個功能中做的是:

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

等等


圖片的標題說明:

I.如果你的假設是有效的,那么你就不需要演員:

const SingleCharPtr p1 = a;

比...更受歡迎

const SingleCharPtr p1 = (SingleCharPtr)a;

因為這個

II。 比較函數不必返回-101 它應該返回一個小於0,0或大於0的整數。因此,在CompareWeight()所有巨大的if是完全多余的,寫

return p1->Weight - p2->Weight;

代替。

III。 SingleCharPtr *chars = malloc(ARRAY_SZ * sizeof(SingleCharPtr)); - 為什么? 您只在main()函數中本地使用chars數組,不需要動態分配。 為什么不寫

SingleCharPtr chars[ARRAY_SZ];

代替?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM