Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.64
$ht0p0r
3 / 0 / 0
Регистрация: 03.07.2011
Сообщений: 3
04.03.2012, 14:47     Создание односвязного списка из строки, полученной в файле #1
Здравствуйте, имеется файл, который содержит некий текст. Необходимо подсчитать количество вхождений каждого слова в этот текст и результат поместить в односвязный список. Вот мой код
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. В чем может быть проблема?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.03.2012, 14:47     Создание односвязного списка из строки, полученной в файле
Посмотрите здесь:

C++ Заполнение односвязного списка
C++ шаблон односвязного списка
C++ сортировка односвязного списка
Создание односвязного циклического списка C++
C++ Сортировка односвязного списка
C++ Создание односвязного списка
Удаление элементов из односвязного списка списка C++
C++ Вывод односвязного списка на C

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
04.03.2012, 16:13     Создание односвязного списка из строки, полученной в файле #2
строка 24
C++
1
2
3
4
5
6
List* l= new List(); 
 
List::List(){
        head=NULL;
        current=NULL;
};
зачем эта глобальная l? для нее вызывается конструктор без аргументов, в котором head и current инициализируются нулем. А потом в методах списка используется эта глобальный указатель с нулевыми данными для подсчета чего-то. в общем все криво сделано. Освойте дебагер студийный. при краше там ясно видно, что идет обращение к нулевым указателям (наведите мышку на переменные, будут выводится их значения). Почему они не проинициализировались тоже в отладке сможете понять.
$ht0p0r
3 / 0 / 0
Регистрация: 03.07.2011
Сообщений: 3
04.03.2012, 18:04  [ТС]     Создание односвязного списка из строки, полученной в файле #3
Исправил, теперь все компилируется нормально. Но код не работает. Выводится только строка из конструктора класса. Прошу проверить код, не уверен в правильности использования 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;
}
Yandex
Объявления
04.03.2012, 18:04     Создание односвязного списка из строки, полученной в файле
Ответ Создать тему
Опции темы

Текущее время: 09:34. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru