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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Lexa_Aleynik
0 / 0 / 0
Регистрация: 19.08.2010
Сообщений: 8
#1

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

20.10.2010, 16:20. Просмотров 515. Ответов 8
Метки нет (Все метки)

Инициализируется всего одна структура данных, затем система пишет: "Ошибка сегментации". Подскажите, в чём проблема.

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;
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.10.2010, 16:20
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Линейный однонаправленный список; ошибка сегментации (C++):

Линейный однонаправленный список - C++
Есть программа, которая инициализирует, заполняет и удаляет список. При компиляции появляется ошибка, что c и m в функции main() не...

Однонаправленный линейный список - C++
здравствуйте! помогите помочь написать задача или киньте ссылку по её решению. &quot;однонаправленный линейный список. максимальный элемент...

Линейный однонаправленный список - C++
Добрый вечер! Задача: L – линейный однонаправленный список Проверить, упорядочены ли элементы списка по алфавиту. Подскажите...

Линейный однонаправленный список - C++
ПОМОГИТЕ СДЕЛАТЬ ПОЖАЛУЙСТА Читая целые числа из текстового файла, создать линейный односвязный список а) добавлением нового элемента...

Линейный однонаправленный список - C++
всем доброго времени не получается создать функцию слияния двух списков методом расчесок( допустим первый список 1 3 5 второй 2 4 6 а после...

Линейный циклический однонаправленный список - C++
Задание организовать очередь с приоритетом (у каждого элемента свой приоритет). Элементы с наивысшим приоритетом ставятся в начало очереди,...

8
Andrew_Lvov
Эксперт С++
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 760
Записей в блоге: 1
20.10.2010, 16:41 #2
Указатель bus не инициализирован.
0
Lexa_Aleynik
0 / 0 / 0
Регистрация: 19.08.2010
Сообщений: 8
20.10.2010, 16:51  [ТС] #3
инициализация полей bus должна происходить в строках 118, 122, 126
0
Andrew_Lvov
Эксперт С++
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 760
Записей в блоге: 1
20.10.2010, 16:58 #4
Цитата Сообщение от Lexa_Aleynik Посмотреть сообщение
инициализация полей bus должна происходить в строках 118, 122, 126
Но не происходит, так как не полей bus не существует, равно как и самого объекта bus. Есть только указатель, к-рый указывает невесть куда.
0
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;
}
0
Andrew_Lvov
Эксперт С++
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 760
Записей в блоге: 1
20.10.2010, 17:16 #6
Цитата Сообщение от Lexa_Aleynik Посмотреть сообщение
благодарю Andrew_Lvov за указанную ошибку, код программы я исправил, но проблема инициализации осталась
Пишите более понятно, что имеется ввиду. Какая ошибка, в какой линии. Если Вижуал Студио - жмите Ф5, "брейк" на ошибке.
В ф-ции принт() должно быть вместо while(phead!=0) -> while( pcurrent != NULL )
0
Lexa_Aleynik
0 / 0 / 0
Регистрация: 19.08.2010
Сообщений: 8
20.10.2010, 17:31  [ТС] #7
среда разработки - geany 0.18
После сборки, компилирования и запуска на исполнение программа предлагает создать и заполнить список структур пользовательскими данными, создаётся и инициализируется только один объект этого списка, далее система выдаёт "ошибку сегментирования", а мне надо создать список из нескольких структур.
0
Andrew_Lvov
Эксперт С++
259 / 189 / 5
Регистрация: 19.08.2010
Сообщений: 760
Записей в блоге: 1
20.10.2010, 17:38 #8
Цитата Сообщение от Lexa_Aleynik Посмотреть сообщение
среда разработки - geany 0.18
После сборки, компилирования и запуска на исполнение программа предлагает создать и заполнить список структур пользовательскими данными, создаётся и инициализируется только один объект этого списка, далее система выдаёт "ошибку сегментирования", а мне надо создать список из нескольких структур.
И что, при ошибке оно не указывает, в какой линии ошибка ? Просто получается, что я за вас дебагаю.

Ф-ция List_bus::Del_numb_bus возвращает неинициализированный ptemp.
0
Lexa_Aleynik
0 / 0 / 0
Регистрация: 19.08.2010
Сообщений: 8
20.10.2010, 17:51  [ТС] #9
Спасибо ещё раз, я разобрался, ошибка алгоритмического характера, сейчас буду "перекраивать код".
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.10.2010, 17:51
Привет! Вот еще темы с ответами:

линейный однонаправленный список (вопрос по сути) - C++
Не понимаю смысла линейного однонаправленного списка. Допустим есть список: struct Node { int d; //хранимое...

Линейный однонаправленный список. Удаление элементов - C++
Создать линейный однонаправленный список. Удалить из него все символы 'p' перед символом 'a'. Вывести список после ввода символов и после...

Переписать слова предложения в однонаправленный линейный список - C++
Ввести с клавиатуры предложения и переписать его слова в однонаправленный линейный список . Исключить из списка все вхождения заданного...

Однонаправленный линейный список абонентов телефонной станции - C++
Построить однонаправленный линейный список абонентов телефонной станции, упорядоченный лексико-графически, содержащий ФИО и семизначный...


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

Или воспользуйтесь поиском по форуму:
9
Yandex
Объявления
20.10.2010, 17:51
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru