#c
#c
Вопрос:
Используя qsort
в дереве, состоящем из структур, я не получаю обратно отсортированный массив.
Я пробовал манипулировать функцией сравнения и qsort
но не уверен, в чем проблема.
typedef struct nodeBST { // struct
char *key;
int count;
struct nodeBST *left;
struct nodeBST *right;
} nodeBST;
qsort(*words, numTokensActual, sizeof(nodeBST), comparator); //qsort
for (i = 0; i < numTokensActual; i ) {
printf("sorted words[%d]:%s: %d n", i,
((struct nodeBST *)words[i])->key,
((struct nodeBST *)words[i])->count); //traverse to print
}
struct nodeBST *words[4]; //creation of array and malloc for space
int z;
for (z = 0; z < 4; z ) {
words[z] = malloc(sizeof(nodeBST));
}
int comparator(const void *p, const void *q) { //compare function
struct nodeBST *a = (struct nodeBST **)p;
struct nodeBST *b = (struct nodeBST **)q;
return a->count - b->count;
}
printf("%d n"((struct nodeBST*)words[i])->count); //print output
int numTokensActual = AddToArray(root, words, 0);
int AddToArray(nodeBST *node, nodeBST **arr, int i) {
if (node == NULL)
return i;
if (node->left != NULL)
i = AddToArray(node->left, arr, i);
//printf("Adding To Array[%d]: %s:%dn",i, node->key, node->count);
//arr[i] = node;
arr[i] = newNodeBST2(node->key, node->count);
//printf("added array[%d]: %sn", i, arr[i]->key);
i ;
if (node->right != NULL)
i = AddToArray(node->right, arr, i);
return i;
}
Я ожидаю, что на выходе я получу отсортированный массив, но на выходе:
0
0
49
6
Комментарии:
1.
struct nodeBST * a = (struct nodeBST**) p;
ошибка на нескольких уровнях. Вам нужно отладить свой код , прежде чем запрашивать SO.2. Мои входные данные для массива — это слова из текстового файла, которые я сохраняю как токены, а затем создаю массив структур, из которых я беру «количество» слов или частоты слов. Третье слово не появляется 49 раз.
3. Рассказчик, я отладил свой код, но не могу найти проблему. Просто не получается правильных сравнений.
4.
qsort
для непрерывно выделяемой памяти, для массива. Вы строите дерево. Вы должны написатьqsort
алгоритм самостоятельно.5. Помимо того факта, что
qsort
это не подходит ни для чего, кроме массива, из опубликованных фрагментов кода мало что можно сказать. Вы должны опубликовать полную программу с определениями и функциями, чтобы мы могли видеть, как вы используетеqsort
и другие потенциальные проблемы.
Ответ №1:
У вас нет массива, прочитайте документацию:
Функция qsort () сортирует массив с элементами nmemb размером size.
Мы можем использовать qsort для получения отсортированного списка элементов без изменения вашей структуры данных, если вы создаете временный массив с count
и указателем на элементы типа:
struct {
int count;
struct nodeBST *node;
} tempSortedNodes[numTokensActual];
Пройдитесь по вашему дереву и заполните sorted
массив, затем вы можете выполнить qsort его. Обратите внимание, что отсортированная версия становится недействительной при обновлении дерева.
Другим подходом было бы использовать другое дерево count
в качестве ключа вместо этого. Это вторичное дерево также будет недействительным при каждом обновлении исходного дерева. Однако мы могли бы обновить оба дерева, если вам нужно постоянно поддерживать версию дерева, отсортированную по количеству.
Алгоритм сортировки для дерева, предложенный в комментариях, вообще не является хорошей идеей. Это было бы эквивалентно созданию нового дерева с использованием count
ключа as, как я предложил.