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

Линейный однонаправленный список; ошибка сегментации - C++

Восстановить пароль Регистрация
 
Lexa_Aleynik
0 / 0 / 0
Регистрация: 19.08.2010
Сообщений: 8
20.10.2010, 16:20     Линейный однонаправленный список; ошибка сегментации #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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
#include<iostream>
#include<string.h>
 
using std::cin;
using std::cout;
using std::endl;
 
const int l_name = 31, l_numb = 7;
 
struct Elem_bus
{
    char numb_bus [l_numb];
    char name [l_name];
    int numb_route;
    Elem_bus *pnext;
    
};
 
class List_bus
{
    Elem_bus *pend;
    Elem_bus *phead;
public:
    List_bus();
    ~List_bus();
    void Add_bus(Elem_bus *bus);
    void Print();
    Elem_bus* Del_numb_bus(Elem_bus *key);
};
 
List_bus::List_bus()
{
    phead=pend=NULL;
}
 
List_bus::~List_bus()
{
    while(phead!=0)
    {
        Elem_bus *pcurrent=phead;
        phead=phead->pnext;
        delete pcurrent;
    }
}
 
void List_bus::Add_bus(Elem_bus *bus)
{   
    Elem_bus *pcurrent=new Elem_bus;
 
    strcpy(pcurrent->numb_bus,bus->numb_bus);
    strcpy(pcurrent->name,bus->name);
    pcurrent->numb_route=bus->numb_route;
 
    pcurrent->pnext=NULL;
    
    if(phead!=NULL)
    {
                pend->pnext=pcurrent;
                pend=pcurrent;
    }
    else
    {
        phead=pend=pcurrent;
    }
}
 
void List_bus::Print()
{
    Elem_bus *pcurrent=phead;
    while(phead!=0)
    {
        cout<<pcurrent->numb_bus<<" | "<<pcurrent->name<<" | "<<pcurrent->numb_route<<" | \n";
        pcurrent=pcurrent->pnext;
    }
    cout<<"\n\n";
}
Elem_bus* List_bus::Del_numb_bus(Elem_bus *key)
{
    Elem_bus *pcurrent=phead;
    Elem_bus *ptemp;
    if(key->numb_bus==phead->numb_bus)
    {   
        phead=phead->pnext;
        ptemp=pcurrent;
    }
    else
    {
        while(pcurrent)
        {
            pend->pnext=pcurrent;
            pend=pcurrent;
            if(key->numb_bus==pcurrent->numb_bus)
            {
                pend->pnext=pcurrent->pnext;
                pend=pcurrent->pnext;
                ptemp=pcurrent;
                break;
            }
        }
    }
    return ptemp;
}
//-------------------------------------------------------------------------------------------------------------------------------
int main()
{
    Elem_bus* key;
    int n;
    List_bus in_park,in_route;
    Elem_bus *bus;
 
    cout<<"create bus park\n";
    cout<<"enter list of buses\n";
    do
    {   
        do
        {
            cout<<"Number of the bus:  # ";
            cin>>bus->numb_bus;
            cout<<endl;
            
            cout<<"Name driver: ";
            cin>>bus->name;
            cout<<endl;
            
            cout<<"Number route of the bus:  # ";
            cin>>bus->numb_route;
            cout<<endl;
            
            in_park.Add_bus(bus);
        }
        while((bus->numb_bus[0]=='s')&&(strlen(bus->numb_bus)==1));
 
        cout<<"Choose comand:\n";
        cout<<"Print information about buses, which located in park : Press '1'\n";
        cout<<"Output bus from park in route : Press '2'\n";
        cout<<"Input bus in park from route : Press '3'\n";
        cin>>n;
        switch(n)
        {
            case 1:in_park.Print();
                break;
            case 2:
                    {
                        cout<<"enter number of the bus: # ";    
                        cin>>key->numb_bus;
                        in_route.Add_bus(in_park.Del_numb_bus(key));
                    }
            case 3:
                    {
                        cout<<"enter number of the bus: # ";    
                        cin>>key->numb_bus;
                        in_park.Add_bus(in_route.Del_numb_bus(key));
                    }
        }
    }
    while((bus->numb_bus[0]!='e')&&(strlen(bus->numb_bus)==1));
    return 0;
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Andrew_Lvov
Эксперт C++
 Аватар для Andrew_Lvov
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 758
Записей в блоге: 1
20.10.2010, 16:41     Линейный однонаправленный список; ошибка сегментации #2
Указатель bus не инициализирован.
Lexa_Aleynik
0 / 0 / 0
Регистрация: 19.08.2010
Сообщений: 8
20.10.2010, 16:51  [ТС]     Линейный однонаправленный список; ошибка сегментации #3
инициализация полей bus должна происходить в строках 118, 122, 126
Andrew_Lvov
Эксперт C++
 Аватар для Andrew_Lvov
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 758
Записей в блоге: 1
20.10.2010, 16:58     Линейный однонаправленный список; ошибка сегментации #4
Цитата Сообщение от Lexa_Aleynik Посмотреть сообщение
инициализация полей bus должна происходить в строках 118, 122, 126
Но не происходит, так как не полей bus не существует, равно как и самого объекта bus. Есть только указатель, к-рый указывает невесть куда.
Lexa_Aleynik
0 / 0 / 0
Регистрация: 19.08.2010
Сообщений: 8
20.10.2010, 17:09  [ТС]     Линейный однонаправленный список; ошибка сегментации #5
благодарю Andrew_Lvov за указанную ошибку, код программы я исправил, но проблема инициализации осталась

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
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
#include<iostream>
#include<string.h>
 
using std::cin;
using std::cout;
using std::endl;
 
const int l_name = 31, l_numb = 7;
 
struct Elem_bus
{
    char numb_bus [l_numb];
    char name [l_name];
    int numb_route;
    Elem_bus *pnext;
    
};
 
class List_bus
{
    Elem_bus *pend;
    Elem_bus *phead;
public:
    List_bus();
    ~List_bus();
    void Add_bus(Elem_bus *bus);
    void Print();
    Elem_bus* Del_numb_bus(Elem_bus *key);
};
 
List_bus::List_bus()
{
    phead=pend=NULL;
}
 
List_bus::~List_bus()
{
    while(phead!=0)
    {
        Elem_bus *pcurrent=phead;
        phead=phead->pnext;
        delete pcurrent;
    }
}
 
void List_bus::Add_bus(Elem_bus *bus)
{   
    Elem_bus *pcurrent=new Elem_bus;
 
    strcpy(pcurrent->numb_bus,bus->numb_bus);
    strcpy(pcurrent->name,bus->name);
    pcurrent->numb_route=bus->numb_route;
 
    pcurrent->pnext=NULL;
    
    if(phead!=NULL)
    {
                pend->pnext=pcurrent;
                pend=pcurrent;
    }
    else
    {
        phead=pend=pcurrent;
    }
}
 
void List_bus::Print()
{
    Elem_bus *pcurrent=phead;
    while(phead!=0)
    {
        cout<<pcurrent->numb_bus<<" | "<<pcurrent->name<<" | "<<pcurrent->numb_route<<" | \n";
        pcurrent=pcurrent->pnext;
    }
    cout<<"\n\n";
}
Elem_bus* List_bus::Del_numb_bus(Elem_bus *key)
{
    Elem_bus *pcurrent=phead;
    Elem_bus *ptemp;
    if(key->numb_bus==phead->numb_bus)
    {   
        phead=phead->pnext;
        ptemp=pcurrent;
    }
    else
    {
        while(pcurrent)
        {
            pend->pnext=pcurrent;
            pend=pcurrent;
            if(key->numb_bus==pcurrent->numb_bus)
            {
                pend->pnext=pcurrent->pnext;
                pend=pcurrent->pnext;
                ptemp=pcurrent;
                break;
            }
        }
    }
    return ptemp;
}
//-------------------------------------------------------------------------------------------------------------------------------
int main()
{
    Elem_bus key, bus;
    int n;
    List_bus in_park,in_route;
    
    cout<<"create bus park\n";
    cout<<"enter list of buses\n";
    do
    {   
        do
        {
            cout<<"Number of the bus:  # ";
            cin>>bus.numb_bus;
            cout<<endl;
            
            cout<<"Name driver: ";
            cin>>bus.name;
            cout<<endl;
            
            cout<<"Number route of the bus:  # ";
            cin>>bus.numb_route;
            cout<<endl;
            
            in_park.Add_bus(&bus);
        }
        while((bus.numb_bus[0]=='s')&&(strlen(bus.numb_bus)==1));
 
        cout<<"Choose comand:\n";
        cout<<"Print information about buses, which located in park : Press '1'\n";
        cout<<"Output bus from park in route : Press '2'\n";
        cout<<"Input bus in park from route : Press '3'\n";
        cin>>n;
        switch(n)
        {
            case 1:in_park.Print();
                break;
            case 2:
                    {
                        cout<<"enter number of the bus: # ";    
                        cin>>key.numb_bus;
                        in_route.Add_bus(in_park.Del_numb_bus(&key));
                    }
            case 3:
                    {
                        cout<<"enter number of the bus: # ";    
                        cin>>key.numb_bus;
                        in_park.Add_bus(in_route.Del_numb_bus(&key));
                    }
        }
    }
    while((bus.numb_bus[0]!='e')&&(strlen(bus.numb_bus)==1));
    return 0;
}
Andrew_Lvov
Эксперт C++
 Аватар для Andrew_Lvov
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 758
Записей в блоге: 1
20.10.2010, 17:16     Линейный однонаправленный список; ошибка сегментации #6
Цитата Сообщение от Lexa_Aleynik Посмотреть сообщение
благодарю Andrew_Lvov за указанную ошибку, код программы я исправил, но проблема инициализации осталась
Пишите более понятно, что имеется ввиду. Какая ошибка, в какой линии. Если Вижуал Студио - жмите Ф5, "брейк" на ошибке.
В ф-ции принт() должно быть вместо while(phead!=0) -> while( pcurrent != NULL )
Lexa_Aleynik
0 / 0 / 0
Регистрация: 19.08.2010
Сообщений: 8
20.10.2010, 17:31  [ТС]     Линейный однонаправленный список; ошибка сегментации #7
среда разработки - geany 0.18
После сборки, компилирования и запуска на исполнение программа предлагает создать и заполнить список структур пользовательскими данными, создаётся и инициализируется только один объект этого списка, далее система выдаёт "ошибку сегментирования", а мне надо создать список из нескольких структур.
Andrew_Lvov
Эксперт C++
 Аватар для Andrew_Lvov
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 758
Записей в блоге: 1
20.10.2010, 17:38     Линейный однонаправленный список; ошибка сегментации #8
Цитата Сообщение от Lexa_Aleynik Посмотреть сообщение
среда разработки - geany 0.18
После сборки, компилирования и запуска на исполнение программа предлагает создать и заполнить список структур пользовательскими данными, создаётся и инициализируется только один объект этого списка, далее система выдаёт "ошибку сегментирования", а мне надо создать список из нескольких структур.
И что, при ошибке оно не указывает, в какой линии ошибка ? Просто получается, что я за вас дебагаю.

Ф-ция List_bus::Del_numb_bus возвращает неинициализированный ptemp.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.10.2010, 17:51     Линейный однонаправленный список; ошибка сегментации
Еще ссылки по теме:

Линейный однонаправленный список C++
C++ Линейный циклический однонаправленный список
Линейный однонаправленный список C++

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

Или воспользуйтесь поиском по форуму:
Lexa_Aleynik
0 / 0 / 0
Регистрация: 19.08.2010
Сообщений: 8
20.10.2010, 17:51  [ТС]     Линейный однонаправленный список; ошибка сегментации #9
Спасибо ещё раз, я разобрался, ошибка алгоритмического характера, сейчас буду "перекраивать код".
Yandex
Объявления
20.10.2010, 17:51     Линейный однонаправленный список; ошибка сегментации
Ответ Создать тему
Опции темы

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