Составить частотный словарь вводимого текста - C (СИ)
Формулировка задачи:
Составить частотный словарь вводимого текста. Распечатать его по алфавиту, а справа от каждого слова - частоту, с которой оно встретилось. помогите пожалуйста
Решение задачи: «Составить частотный словарь вводимого текста»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <assert.h>
struct Node {
int val;
const char *key;
struct Node *left, *right;
};
void add(struct Node **root, const char *key) {
assert(root);
while (*root) {
int cmp = strcmp(key, (*root)->key);
if (cmp == 0) {
(*root)->val++;
return;
}
if (cmp < 1) {
root = &(*root)->left;
} else {
root = &(*root)->right;
}
}
*root = (struct Node *) malloc(sizeof(struct Node));
if (!*root) {
exit(1);
}
(*root)->key = key;
(*root)->val = 1;
(*root)->left = (*root)->right = NULL;
}
void print(struct Node *root) {
if (root) {
print(root->left);
printf("%s => %d\n", root->key, root->val);
print(root->right);
}
}
int main() {
const char *delim = " ,.:;!?";
struct Node *root = NULL;
char *tok;
char str[256];
gets(str); // да, эту функцию лучше не использовать :)
tok = strtok(str, delim);
while (tok) {
add(&root, tok);
tok = strtok(NULL, delim);
}
print(root);
putchar('\n');
return 0;
}
Объяснение кода листинга программы
- Включаются необходимые заголовочные файлы: stdio.h, stdlib.h, string.h, assert.h
- Определяется структура Node, которая содержит значения ключа и значения, а также указатели на левое и правое поддерево.
- Определяются две функции: add и print. Функция add добавляет новый узел в дерево, а функция print выводит значения всех узлов дерева в консоль.
- В функции main создается пустое корневое значение для дерева.
- Вводится строка, которую необходимо разбить на токены с использованием функции strtok.
- Для каждого токена вызывается функция add, чтобы добавить его в дерево.
- После обработки всех токенов вызывается функция print, чтобы вывести значения всех узлов дерева.
- Возвращается 0, чтобы указать, что программа успешно завершилась.