Я делаю упражнение K & R 6-4, а именно:
6-4.Напишите программу, которая печатает отдельные слова на входе, отсортированные в порядке убывания частоты встречаемости.Каждому слову предшествует его количество.
Я решил создать структуру с именем dstncFreqNode6_4:
struct dstncFreqNode6_4
{
char *word;
int count;
struct dstncFreqNode6_4 *left;
struct dstncFreqNode6_4 *right;
};
Затем я проанализировал ввод для слов и для каждого отдельного слова.создал один узел "dstncFreqNode6_4" и два указателя на него: один для вставки в BST (для добавления новых слов / обновления количества уже найденных слов) и один для вставки в глобальный массив указателей "dsntFredNode6_4".
Это было сделано для того, чтобы я мог обновить количество слов (узлов), пройдя BST (который содержит указатели на все слова, встречающиеся до сих пор).После того, как весь ввод был проанализирован, массив указателей будет отсортирован по переменным count и затем напечатан.Так как
Код, добавление новых слов / обновление счетчиков здесь: ( Я не думаю, что с этим что-то не так, поскольку BST и массив, по-видимому, заполнены правильно, так что выможет игнорировать это) :
//"wordCounts" is originally a global dstncFreqNode6_4** declared outside the function, numWords is the current length of the array
struct dstncFreqNode6_4 *addFreqNode6_4(struct dstncFreqNode6_4 *root, char *word)
{
if(root == NULL)
{
root = (struct dstncFreqNode6_4 *) malloc(sizeof(struct dstncFreqNode6_4));
root -> word = word;
root -> count = 1;
root -> left = NULL;
root -> right = NULL;
struct dstncFreqNode6_4 **p;
wordCounts = (struct dstncFreqNode6_4 **) realloc(wordCounts, sizeof(struct dstncFreqNode6_4*) * (numWords +1));
p = wordCounts + numWords++;
(*p) = root;
}
else if(strcmp(word, root -> word) < 0)
root -> left = addFreqNode6_4(root -> left, word);
else if(strcmp(word, root -> word) > 0)
root -> right = addFreqNode6_4(root -> right, word);
else
root -> count++;
return root;
}
Так что у меня все работает правильно, кроме сортировки;это просто не будет сортировать массив.То есть ... порядок элементов остается неизменным РЕДАКТИРОВАТЬ: Я получаю ошибку сегментации. РЕДАКТИРОВАТЬ # 2: Нет ошибки сегментации сейчас;исходная проблема все еще существует.
Я использую метод qsort из stlib.h;Я использую функцию сравнения:
int qcmp6_4(const void *a, const void *b)
{
return (*(struct dstncFreqNode6_4 **)a) -> count - (*(struct dstncFreqNode6_4 **)b) -> count;
}
Я не могу понять, почему она не сортируется правильно.Я фактически реализовал свой собственный алгоритм быстрой сортировки и получаю те же результаты.Я действительно не знаю на данный момент.
Было бы неплохо получить свежие и экспертные глаза, чтобы направить меня в правильном направлении.Спасибо.
РЕДАКТИРОВАТЬ
Извините, вот вызов qsort:
qsort(wordCounts, numWords, sizeof(struct dstncFreqNode6_4 *), qcmp6_4);
РЕДАКТИРОВАТЬ # 2:
Следуя предложению, я сделал "wordCounts" массив указателей на узлы ( весь код в этом посте был обновлен, чтобы отразить это ).Таким образом, по сути, BST и массив содержат одинаковую информацию (фактически указатели массива инициализируются соответствующим указателем в BST), но их использование отличается.BST используется для добавления новых слов / обновления количества уже найденных, а массив сортируется в конце (по количеству каждого слова) и печатается.Тем не менее, я сталкиваюсь с той же проблемой, с которой я столкнулся: порядок массива остается неизменным после вызова qsort.