对具有数字和字符的结构进行qsort,首先对数字进行排序,然后对具有相同数字的字母进行排序

时间:2018-09-18 17:23:46

标签: c qsort

想对具有数字和字符的结构进行qsort,首先对数字进行排序,然后对具有相同数字的字母进行排序 这是我拥有的结构

typedef struct{
    char word[101];
    int freq;
}WordArray;

这是我遵循的逻辑:首先对频率排序()

int cmpffunc (const void * a, const void * b)
{
    WordArray *WordArrayA = (WordArray *)a;
    WordArray *WordArrayB = (WordArray *)b;
    return ( WordArrayB->freq - WordArrayA->freq );
}
qsort(array, arrayLength, sizeof(WordArray), cmpffunc);

哪个工作正常,然后我尝试对具有相同频率编号的字母进行排序。这是我尝试过的方法,但没有一个能按预期工作:

int cmpwfunc (const void * a, const void * b)
{
    WordArray *A = (WordArray *)a;
    WordArray *B = (WordArray *)b;
    if (A->freq == B->freq){
        return strcmp(A->word,B->word);
    }
    else{
        return -1;
    }
}
qsort(array, arrayLength, sizeof(WordArray), cmpwfunc);

任何建议将不胜感激。

1 个答案:

答案 0 :(得分:2)

第二个版本的问题是A->freqB->freq 相等。在这种情况下,您不能仅return -1。在这种情况下,您需要比较 A->freqB->freq就像您在第一个函数中所做的一样。所以...

更改

else{
    return -1;
}

return ( B->freq - A->freq );

或者更好-将其更改为

if ( B->freq > A->freq ) return 1;
return -1;