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