Алфавитно-частотный словарь - исправить ошибки в коде - C (СИ)
Формулировка задачи:
Столкнулся с проблемой, взял код из учебника, а он в упрямую не работает, я и понять не могу в чем дело(. Объясните, пожалуйста.
struct Node { char word[40]; // область данных int coun; Node *next; // ссылка на следующий узел }; typedef Node *PNode; // тип данных: указатель на узел int main() { PNode Head = NULL, p, where; FILE *in, *out; char word[80]; int n; in = fopen ( "input.dat", "r" ); while ( 1 ) { n = fscanf ( in, "%s", word ); // читаем слово из файла if ( n <= 0 ) break; p = Find ( Head, word ); // ищем слово в списке if ( p != NULL ) // если нашли слово, p->coun ++; // увеличить счетчик else { p = CreateNode ( word ); // создаем новый узел where = FindPlace ( Head, word ); // ищем место if ( ! where ) AddLast ( Head, p ); else AddBefore ( Head, where, p ); } } fclose(in); out = fopen ( "output.dat", "w" ); p = Head; while ( p ) { // проход по списку и вывод результатов fprintf ( out, "%-20s\t%d\n", p->word, p->coun ); p = p->next; } fclose(out); }
Решение задачи: «Алфавитно-частотный словарь - исправить ошибки в коде»
textual
Листинг программы
//#include <string.h> #include <cstring> #include <stdio.h> #include <conio.h> #include<iostream> struct Node { char word[40]; // область данных int count; Node *next; // ссылка на следующий узел }; typedef Node* PNode; // тип данных: указатель на узел /* PNode CreateNode(char NewWord[]) { PNode NewNode = new Node; // указатель на новый узел strcpy(NewNode->word, NewWord); // записать слово NewNode->count = 1; // счетчик слов = 1 NewNode->next = NULL; // следующего узла нет return NewNode; // результат функции Ц адрес узла } */ PNode CreateNode(char NewWord[]){ PNode NewNode = new Node; // указатель на новый узел strcpy (NewNode->word, NewWord); // записать слово NewNode->count = 1; // счетчик слов = 1 NewNode->next = NULL; // следующего узла нет return NewNode; // результат функции – адрес узла } void AddFirst(PNode &Head, PNode NewNode) { NewNode->next = Head; Head = NewNode; } void AddAfter(PNode p, PNode NewNode) { NewNode->next = p->next; p->next = NewNode; } void AddBefore(PNode &Head, PNode p, PNode NewNode) { PNode q = Head; if (Head == p) { AddFirst(Head, NewNode); // вставка перед первым узлом return; } while (q && q->next != p) // ищем узел, за которым следует p q = q->next; if (q) // если нашли такой узел, AddAfter(q, NewNode); // добавить новый после него } void AddLast(PNode &Head, PNode NewNode) { PNode q = Head; if (Head == NULL) { // если список пуст, AddFirst(Head, NewNode); // вставл¤ем первый элемент return; } while (q->next) q = q->next; // ищем последний элемент AddAfter(q, NewNode); } PNode Find(PNode Head, char NewWord[]) { PNode q = Head; while (q && strcmp(q->word, NewWord)) q = q->next; return q; } PNode FindPlace(PNode Head, char NewWord[]) { PNode q = Head; while (q && (strcmp(q->word, NewWord) > 0)) q = q->next; return q; } int main() { PNode Head = NULL, p, where; FILE *in, *out; char word[80]; int n; in = fopen("input.txt", "r"); while (!feof(in)) { n = fscanf (in, "%s", word); // читаем слово из файла //if ( n <= 0 ) break; p = Find(Head, word); // ищем слово в списке if (p != NULL) // если нашли слово, p->count++; // увеличить счетчик else { p = CreateNode(word); // создаем новый узел where = FindPlace(Head, word); // ищем место if (!where) AddLast(Head, p); else AddBefore(Head, where, p); } } fclose(in); out = fopen("output.txt", "w"); p = Head; while (p) { // проход по списку и вывод результатов fprintf(out, "%-20s\t%d\n", p->word, p->count); p = p->next; } fclose(out); }
Объяснение кода листинга программы
- Создание нового узла:
PNode CreateNode(char NewWord[])
- Вставка первого элемента в список:
AddFirst(Head, NewNode)
- Вставка элемента перед указанным узлом:
AddBefore(Head, p, NewNode)
- Вставка элемента после указанного узла:
AddAfter(p, NewNode)
- Вставка последнего элемента в список:
AddLast(Head, NewNode)
- Поиск узла по слову:
Find(Head, NewWord)
- Поиск места для вставки узла по слову:
FindPlace(Head, NewWord)
- Проход по списку и вывод результатов:
p = Head; while (p) { // проход по списку и вывод результатов fprintf(out,
%-20s\t%d\n, p->word, p->count); p = p->next; } fclose(out);
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д