Ричард, обратите внимание на несколько вещей:
- Я не использую пустые указатели при назначении не пустых указателей
- Я не использую typedef ради этого
- Чтобы получить длину массива, я делю размер массива на размер первого элемента в массиве
- Я использую
char *
в struct word
- Я не просто вычитаю частоты в
compare_words
.Чтобы получить порядок, я на самом деле использую if, else if, else.Простое вычитание целых может иметь странное поведение в зависимости от операндов. - Я поддерживаю
const
указатели в моей функции сравнения, чтобы обеспечить неизменность.
Код:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct word {
char *str;
int freq;
};
int compare_words(const void *a, const void *b)
{
const struct word *w1 = a;
const struct word *w2 = b;
int order;
if (w2->freq > w1->freq) {
order = 1;
} else if (w2->freq < w1->freq) {
order = -1;
} else {
order = strcmp(w1->str, w2->str);
}
return order;
}
int main(int argc, char const *argv[])
{
struct word mywords[] = {
{ "BAR", 2 },
{ "BAS", 2 },
{ "ACK", 2 },
{ "FOO", 8 },
{ "ZIP", 1 }
};
int len = sizeof(mywords) / sizeof(mywords[0]);
qsort(mywords, len, sizeof(mywords[0]), compare_words);
int i;
for (i = 0; i < len; i++) {
struct word w = mywords[i];
printf("%s\t%d\n", w.str, w.freq);
}
return 0;
}
Вывод:
FOO 8
ACK 2
BAR 2
BAS 2
ZIP 1