Посчитать сколько слов, содержит текст произвольной длинны - C (СИ)
Формулировка задачи:
Посчитать сколько слов, содержит текст произвольной длинны. Разделителем между словами является
символ пробела. Вывести на экран список всех встречающихся в тексте слов и их количество. Указание:
использовать связный список.
Буду рад подсказкам!Заранее спасибо!
Решение задачи: «Посчитать сколько слов, содержит текст произвольной длинны»
textual
Листинг программы
#include <stdio.h> #include <string.h> #include <ctype.h> typedef struct word_t { char* ptr; unsigned len; } TWord; typedef struct info_t { TWord word; unsigned cnt; } TInfo; typedef struct node_t { TInfo info; struct node_t* next; } TNode; //----------------------------------------------------------------------------- TNode* Find(TNode* list, TWord word) { for (; list; list = list->next) { if ((word.len == list->info.word.len) && (strncmp(word.ptr, list->info.word.ptr, word.len) == 0)) { return list; } } return NULL; } //----------------------------------------------------------------------------- void Push(TNode** list, TWord word) { TNode* node = Find(*list, word); if (node) { node->info.cnt++; } else { node = malloc(sizeof(TNode)); node->info.cnt = 1; node->info.word.ptr = word.ptr; node->info.word.len = word.len; node->next = *list; *list = node; } } //----------------------------------------------------------------------------- void Print(const TNode* list) { for (; list; list = list->next) { printf("%.*s : %u\n", list->info.word.len, list->info.word.ptr, list->info.cnt); } } //----------------------------------------------------------------------------- int GetWord(char* text, TWord* word) { for (; *text && (!isalpha(*text)); ++text) { ; } word->ptr = text; for (; (isalpha(*text)); ++text) { ; } word->len = text - word->ptr; return word->len; } //----------------------------------------------------------------------------- TNode* GetList(char* text) { TNode* list = NULL; TWord word; while (*text) { if (GetWord(text, &word)) { Push(&list, word); } text += word.len + 1; } return list; } //----------------------------------------------------------------------------- int main() { char text[] = "dame trot and her cat\n" "sat down for a chat;\n" "the dame sat on this side\n" "and puss sat on that."; TNode* list = GetList(text); Print(list); return 0; }
Объяснение кода листинга программы
В данном коде используется стек для подсчёта количества вхождений каждого слова в тексте. Список действий:
- Создание структуры word_t — определяет структуру слова, содержащую указатель на строку и длину этой строки.
- Создание структуры info_t — определяет структуру информации о слове, содержащую структуру word_t и счётчик количества вхождений слова.
- Создание структуры node_t — определяет структуру узла списка, содержащую информацию о слове и указатель на следующий узел.
- Функция Find — ищет узел списка, содержащий указанное слово.
- Функция Push — добавляет новое слово в список. Если слово уже есть в списке, увеличивает счётчик.
- Функция Print — выводит информацию о каждом слове из списка.
- Функция GetWord — получает слово из текста, игнорируя символы, не являющиеся буквами.
- Функция GetList — создаёт список слов из текста.
- Основная программа — создаёт текст, содержит строки с примером использования функции GetList.
- Вывод информации о словах в списке — с помощью функции Print выводится информация о каждом слове из списка.
- Завершение программы — программа завершается, возвращая 0.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д