0 / 0 / 0
Регистрация: 19.08.2010
Сообщений: 8
1

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

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

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

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
20.10.2010, 16:20
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
20.10.2010, 16:20
Ответы с готовыми решениями:

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

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

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

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

Ф-ция List_bus::Del_numb_bus возвращает неинициализированный ptemp.
0
0 / 0 / 0
Регистрация: 19.08.2010
Сообщений: 8
20.10.2010, 17:51  [ТС] 9
Спасибо ещё раз, я разобрался, ошибка алгоритмического характера, сейчас буду "перекраивать код".
0
20.10.2010, 17:51
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
20.10.2010, 17:51
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему

Редактор формул (кликните на картинку в правом углу, чтобы закрыть)
Опции темы

Новые блоги и статьи
Ключевые слова Python
hw_wired 15.02.2025
Ключевые слова в Python - это специальные зарезервированные слова, которые имеют особое значение и функции в языке. В настоящее время Python включает 35 ключевых слов и 4 мягких ключевых слова. Эти. . .
Отличия изменяемых и неизменяемых типов в Python
hw_wired 15.02.2025
В Python существует принципиальное различие между изменяемыми (mutable) и неизменяемыми (immutable) типами данных, которое оказывает существенное влияние на работу программ. Это различие часто. . .
Python: сравнение списков и кортежей
hw_wired 15.02.2025
В Python последовательности являются одними из самых важных и часто используемых типов данных. Они позволяют хранить упорядоченные наборы элементов, к которым можно обращаться по индексу. Среди всех. . .
Как скачивать файлы с URL с помощью Python
hw_wired 15.02.2025
Для скачивания файлов Python предлагает как встроенные средства, так и сторонние библиотеки. Встроенный модуль urllib из стандартной библиотеки обеспечивает базовую функциональность для работы с URL. . .
Использование SQLAlchemy в Python
hw_wired 15.02.2025
SQLAlchemy - мощная библиотека для работы с базами данных в Python, которая предоставляет полноценный набор средств для объектно-реляционного отображения (ORM) и обширные возможности для работы с. . .
Взаимодействие с REST API в Python
hw_wired 15.02.2025
В современном мире разработки программного обеспечения REST API стал неотъемлемой частью архитектуры веб-приложений. API (Application Programming Interface) - это набор правил и протоколов,. . .
Разделение строк в Python
hw_wired 15.02.2025
Python предлагает богатый набор возможностей для работы со строками, и среди них разделение строк занимает особое место. Этот процесс позволяет разбивать текст на отдельные компоненты, что критично. . .
Объединение строк в Python
hw_wired 15.02.2025
При работе с текстовыми данными в Python нередко возникает необходимость объединять несколько строк в одну. Это может потребоваться при форматировании вывода, обработке текстовых файлов или создании. . .
Лучшие игровые движки на Python
hw_wired 15.02.2025
В последнее время разработка игр стала одним из самых популярных направлений программирования, и Python не остался в стороне от этого тренда. Несмотря на то, что Python обычно не ассоциируется с. . .
Декоратор jit в Python
hw_wired 15.02.2025
Если вы достаточно долго изучаете программы и пакеты на Python для машинного обучения, то наверняка замечали, что паттерн "JIT-декоратор" довольно популярен. Этот подход позволяет превратить обычные. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru