Всем привет при компиляции нижеуказанного кода выскакивает ошибка сегментации, не могу понять почему она тут имеет место быть, и как её исправить, буду очень признателен за помощь
/*
Даны два списка целых чисел ������0, причем числа в каждом из списков не повторяются. Построить третий список из чисел,
каждое из которых принадлежит одному списку, и при этом не принадлежит другому
списку.
*/
#include <iostream>
#include <iomanip>
#include <locale.h>
using namespace std;
struct List {
int info;
List* next;
};
int main()
{
setlocale(LC_ALL, "Russian");
//Создание списка a
cout << "Вводите неповторяющиеся целые числа до 0" << endl;
int input;
cin >> input;
List* head = NULL;//голова
List* tail = NULL;//хвост
while (input != 0)
{
List* p = new List;
p->info = input;
p->next = NULL;
if (head == NULL) {//вставка в пустой список
head = p;
tail = p;
}
else {//вставка в непустой список
tail->next = p;
tail = p;
}
cin >> input;
}
//Создание списка b
cout << "Вводите неповторяющиеся целые числа до 0" << endl;
cin >> input;
List* head2 = NULL;//голова
List* tail2 = NULL;//хвост
while (input != 0)
{
List* b = new List;
b->info = input;
b->next = NULL;
if (head2 == NULL) {//вставка в пустой список
head2 = b;
tail2 = b;
}
else {//вставка в непустой список
tail2->next = b;
tail2 = b;
}
cin >> input;
}
//вывод списка a на консоль
cout << "Введенный список a" << endl;
List* p = head;
while (p != NULL) {
cout << setw(8) << p->info;
p = p->next;
}
cout << endl;
//вывод списка b на консоль
cout << "Введенный список b" << endl;
List* b = head2;
while (b != NULL) {
cout << setw(8) << b->info;
b = b->next;
}
cout << endl;
//построение третьего списка c
List* head3 = NULL;//голова
List* tail3 = NULL;//хвост
List* c = new List;
b = head2;
p = head;
while (p != NULL) {
if (p->info != b->info)
{
b = b->next;
}
else
{
p = p->next;
b = head2;
}
if (p->info != b->info && b->next==NULL)
{
c->info = p->info;
c->next = NULL;
List* c = new List;
if (head3 == NULL)
{//вставка в пустой список
head3 = c;
tail3 = c;
}
else
{//вставка в непустой список
tail3->next = c;
tail3 = c;
}
}
}
//вывод списка c на консоль
cout << "Введенный список c" << endl;
while (c != NULL) {
List* c = head3;
cout << setw(8) << c->info;
c = c->next;
}
cout << endl;
//удаление списка из памяти
p = head;
while (p != NULL) {
List* p1 = p->next;
delete p;
p = p1;
}
head = NULL;
//вывод списка на консоль
cout << "Список после очистки" << endl;
p = head;
while (p != NULL) {
cout << setw(8) << p->info;
p = p->next;
}
cout << endl;
system("pause");
}
Вы объявляете внутреннюю переменную c
, которая конфликтует с внешней переменной c
что выше.
List* c = new List;
...
{
c->info = p->info; // меняется переменная, что выше
c->next = NULL; // там-же
List* c = new List; // эта переменная без значений с мусором памяти
скорее всего вы хотели новую переменную инициализировать :
{ List* c = new List;
c->info = p->info;
c->next = NULL;
Прога падает, потому-что переменная b
стала равна NULL, а вы это не проверили.
// здесь b стала равна NULL
if (p->info != b->info && b->next==NULL)
перед этим надо :
if ( ! b )
break ;
Есть класс CarShop, содержащий в себе следующий переменные:
Во многих примерах кода на сайте встречаются как записи вида void main(), так и int main() для главной функции программы
Вопрос заключается в том, как правильно реализовать Getter для указателя, чтобы он был "безопасным"Под безопасностью я подразумеваю предотвращение...