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

Объяснение кода листинга программы

  1. Создание нового узла: PNode CreateNode(char NewWord[])
  2. Вставка первого элемента в список: AddFirst(Head, NewNode)
  3. Вставка элемента перед указанным узлом: AddBefore(Head, p, NewNode)
  4. Вставка элемента после указанного узла: AddAfter(p, NewNode)
  5. Вставка последнего элемента в список: AddLast(Head, NewNode)
  6. Поиск узла по слову: Find(Head, NewWord)
  7. Поиск места для вставки узла по слову: FindPlace(Head, NewWord)
  8. Проход по списку и вывод результатов: p = Head; while (p) { // проход по списку и вывод результатов         fprintf(out,%-20s\t%d\n, p->word, p->count);         p = p->next;     }     fclose(out);

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

8   голосов , оценка 3.875 из 5