qsort на структуру с числом и символом, сначала сортировка по номеру, а затем сортировка по алфавиту с тем же номером - PullRequest
0 голосов
/ 18 сентября 2018

Хотел бы выполнить qsort по struct с числом и символом, сначала отсортировать по номеру, а затем отсортировать по алфавиту с тем же номером. Вот структура, которая у меня есть

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

Вот логика, которой я следовал: Сортировать поfreq first ()

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 голосов
/ 18 сентября 2018

Проблема с вашей второй версией заключается в том, что A->freq и B->freq равны не .В этом случае вы не можете просто return -1.В этом случае вам нужно сравнить A->freq и B->freq, как вы это делали в первой функции.Итак ...

Изменить

else{
    return -1;
}

на

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

Или лучше - изменить на

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