Алфавитно-частотный словарь - исправить ошибки в коде - 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);