одной структуры данных можно использовать простое бинарное дерево, которое содержит слово, которые вы могли бы сравнить с использованием STRCMP. (Я буду игнорировать вопросы, тематические сейчас).
Вам нужно будет обеспечить дерево остается сбалансированным как вы его вырасти. Для этого посмотрите AVL деревья или 1-2 дерева или красно-черные деревья на википедию или где-нибудь еще.
Я не буду приводить слишком много деталей, кроме того, чтобы создать двоичную древовидную структуру, каждый узел имеют левый и правый подузел, который может быть нулевым, а для листового узла оба суб-узла равны нулю. Для упрощения использования «интрузивного» узла, который имеет значение и два под-узла. Что-то вроде:
struct Node
{
char * value;
size_t frequency;
struct Node * left;
struct Node * right;
};
и, очевидно, C, вам необходимо выполнить все управление памятью.
У вас будет функция, которая повторяет дерево, сравнивая и перемещая влево или вправо в зависимости от ситуации. Если будет найдено, это будет просто вверх по частоте. Если не ваша функция должна быть в состоянии определить место, где нужно вставить узел, а затем логика вставки и перебалансировки. Конечно, новый узел будет содержать слово с частотой 1.
В конце вам понадобится способ рекурсии через ваше дерево, распечатывающее результаты. В вашем случае это может быть рекурсивная функция.
Обратите внимание, что альтернативная структура данных будет представлять собой какую-либо хэш-таблицу.
Если вы ищете наиболее эффективное решение и имеете много памяти под рукой, вы должны использовать структуру данных, посредством которой вы будете проходить через каждую букву по мере ее возникновения. Таким образом, «a» дает вам все слова, начинающиеся с a, затем переходите ко второй букве, которая является «b» и т. Д. Это довольно сложно реализовать для тех, кто не знает структуры данных, поэтому я бы посоветовал вам пойти с простым двоичным деревом.
Обратите внимание, что при распечатке это не будет в обратном порядке частоты, поэтому вам придется сначала отсортировать результаты. (В C++ с использованием карты вы также не получите их в этом порядке).
Вы можете использовать связанный список структур. – CanSpice
Не успевайте вдаваться в подробности, посмотрите на 'trie's. –