Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/26: Рейтинг темы: голосов - 26, средняя оценка - 4.73
3 / 0 / 1
Регистрация: 03.07.2011
Сообщений: 3

Создание односвязного списка из строки, полученной в файле

04.03.2012, 14:47. Показов 4931. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте, имеется файл, который содержит некий текст. Необходимо подсчитать количество вхождений каждого слова в этот текст и результат поместить в односвязный список. Вот мой код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
#include "stdafx.h"
#include <stdio.h>
#include <string.h>
 
struct Word{
    int number;   //число вхождений слова в текст
    char* word;   //само слово
    Word* next;   //указатель на следующую структуру
};
 
class List{
    char str[512];   //строка, в которую помещается текст файла  
    Word* head;      //указатель на первый элемент односвязного списка
    Word* current;   //указатель на текущий элемент
public:
    List();
    List(char path[20]);
    void addWord();
    int check(char* c);
    void search();
    void show();
};
 
List* l= new List();
 
List::List(){
    head=NULL;
    current=NULL;
};
 
List::List(char path[20]){  //в качетсве аргумента задается путь к файлу
    head=NULL;
    current=NULL;
    FILE* f=fopen(path,"r");
    if (f) {
    fgets(str,512,f);
    printf("%s\n",str);
    }
    else {
        printf("Error");
    };
    fclose(f);
};
 
void List::addWord(){  //создание нового элемента списка
    Word* w=new Word;
    w->next=NULL;
    if (l->head==NULL){
        l->head=w;
    }
    else {
        l->current=l->head;
        while(l->current->next!=NULL){
            l->current=l->current->next;
        };
        l->current->next=w;
    };
};
 
int List::check(char* c){  //проверка на наличие слова в списке
    l->current=l->head;
    int a;
    while(l->current->next!=NULL){      //вот здесь
        if (strcmp(l->current->word,c)){
            a=1;
            break;
        }
        else {
            l->current=l->current->next;
            a=0;
        };
    };
    return a;
};
 
void List::search(){  //поиск слов в строке
    int i;
    char* s;
    for(i=0; str[i]; i++){    //преобразование заглавных букв в строчные
        if ((str[i]>='A')&&(str[i]<='Z')){
            str[i]+=32;
        };
    };
 
    for(s=strtok(str," ,.?-!;()"); s!=NULL; s=strtok(NULL," ,.?-!;()")){  //разделение строки на слова
            if (l->check(s)){
                l->current=l->head;
                while (l->current->next!=NULL){
                    if (strcmp(l->current->word,s)){
                        l->current->number=(l->current->number)++;
                    };
                };
            }
            else {
                l->addWord();
                while (l->current->next!=NULL){
                    l->current=l->current->next;
                };
                l->current->word=s;
                l->current->number=1;
            };
        };  
//  };
    printf("%s\n",str);
};
 
void List::show(){  //вывод на экран
    l->current=l->head;
    while(l->current->next!=NULL){
        printf("Word: %s/t Nubmer: %d/n",l->current->word, l->current->number);
        l->current->next;
    };
};
 
int main(){
    List* l=new List("c:\\example1.txt");
    l->search();
    l->show();
    getchar();
    return 0;
}
Visual Studio 2010 при запуске пишет, построение успешно 1, с ошибками 0. На секунду появляется экран с результатом первого printf из конструктора класса, но потом выскакивает окно с надписью
"Необработанное исключение. Нарушение прав доступа при чтении." и стрелка указывает на while из описания check. В чем может быть проблема?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.03.2012, 14:47
Ответы с готовыми решениями:

Создание односвязного списка
Доброй ночи. Пытался сделать эти задания, но во время написания впервые столкнулся с неоднозначными проблемами. Не могу для указателя узла...

Создание односвязного списка
Доброго времени суток. И так. Имеется задача. Создание односвязного списка и инициализация его с клавиатуры. Совсем запутался. ...

Односвязный список: создание и сортировка
Здравствуйте. Помогите, пожалуйста, создать на MASM односвязный список, элементы которого являются записями из трёх полей: ключ, данные,...

2
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
04.03.2012, 16:13
строка 24
C++
1
2
3
4
5
6
List* l= new List(); 
 
List::List(){
        head=NULL;
        current=NULL;
};
зачем эта глобальная l? для нее вызывается конструктор без аргументов, в котором head и current инициализируются нулем. А потом в методах списка используется эта глобальный указатель с нулевыми данными для подсчета чего-то. в общем все криво сделано. Освойте дебагер студийный. при краше там ясно видно, что идет обращение к нулевым указателям (наведите мышку на переменные, будут выводится их значения). Почему они не проинициализировались тоже в отладке сможете понять.
1
3 / 0 / 1
Регистрация: 03.07.2011
Сообщений: 3
04.03.2012, 18:04  [ТС]
Исправил, теперь все компилируется нормально. Но код не работает. Выводится только строка из конструктора класса. Прошу проверить код, не уверен в правильности использования strtok.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
#include "stdafx.h"
#include <stdio.h>
#include <string.h>
 
struct Word{
    int number;   //число вхождений слова в текст
    char* word;   //само слово
    Word* next;   //указатель на следующую структуру
};
 
class List{
    char str[512];   //строка, в которую помещается текст файла  
    Word* head;      //указатель на первый элемент односвязного списка
    Word* current;   //указатель на текущий элемент
public:
    List(char path[20]);
    void addWord();
    int check(char* c);
    void search();
    void show();
};
 
List::List(char path[20]){  //в качетсве аргумента задается путь к файлу
    head=NULL;
    current=NULL;
    FILE* f=fopen(path,"r");
    if (f) {
    fgets(str,512,f);
    printf("%s\n",str);
    }
    else {
        printf("Error");
    };
    fclose(f);
};
 
void List::addWord(){  //создание нового элемента списка
    Word* w=new Word;
    w->next=NULL;
    if (head==NULL){
        head=w;
    }
    else {
        current=head;
        while(current->next!=NULL){
            current=current->next;
        };
        current->next=w;
    };
};
 
int List::check(char* c){  //проверка на наличие слова в списке
    current=head;
    int a=0;
    if(current!=NULL){
      while(current->next!=NULL){       
        if (strcmp(current->word,c)){
            a=1;
            break;
        }
        else {
            current=current->next;
        };
      };
    };
    return a;
};
 
void List::search(){  //поиск слов в строке
    int i;
    char* s;
    for(i=0; str[i]; i++){    //преобразование заглавных букв в строчные
        if ((str[i]>='A')&&(str[i]<='Z')){
            str[i]+=32;
        };
    };
    for(s=strtok(str," ,.?-!;()"); s!=NULL; s=strtok(NULL," ,.?-!;()")){  //разделение строки на слова
            if (check(s)){
                current=head;
                while (current->next!=NULL){
                    if (strcmp(current->word,s)){
                        current->number=(current->number)++;
                    };
                };
            }
            else {
                addWord();
                current=head;
                while (current->next!=NULL){
                    current=current->next;
                };
                current->word=s;
                current->number=1;
            };
        };  
    printf("%s\n",str);
};
 
void List::show(){  //вывод на экран
    current=head;
    while(current->next!=NULL){
        printf("Word: %s/t Nubmer: %d/n",current->word, current->number);
        current->next;
    };
};
 
int main(){
    List* l=new List("e:\\example1.txt");
    l->search();
    l->show();
    getchar();
    return 0;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
04.03.2012, 18:04
Помогаю со студенческими работами здесь

Создание односвязного циклического списка
Структура есть: struct Node { int item; Node*next; }; Как создать вершину и как потом в цикле создавать...

Создание линейного односвязного списка
-найти произведение элементов списка. -вывести на экран нечетные элементы списка.

Создание и заполнение динамического односвязного списка
Выручайте! Никак не могу понять как создать и заполнить односвязный список! На лекции дают какими-то отдельными кусками, причем удаление...

Создание односвязного динамического списка с неограниченным количеством элементов
Доброго времени суток. Данная работа подразумевает создание односвязного динамического списка с неограниченным количеством элементов. После...

Создание и вывод односвязного списка (выводится только первый элемент)
Надо создать список и вывести его, выводит только 1 и последний элемент, не понимаю почему, добавление вроде же правильное. #include...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru