Исправить ошибку (структуры)

259
02 июля 2022, 23:20

Всем привет при компиляции нижеуказанного кода выскакивает ошибка сегментации, не могу понять почему она тут имеет место быть, и как её исправить, буду очень признателен за помощь

/*
Даны два списка целых чисел ������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");
}
Answer 1

Вы объявляете внутреннюю переменную 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 ;
READ ALSO
Как описать max_element у вектора класса?

Как описать max_element у вектора класса?

Есть класс CarShop, содержащий в себе следующий переменные:

340
Тип, возвращаемый функцией main

Тип, возвращаемый функцией main

Во многих примерах кода на сайте встречаются как записи вида void main(), так и int main() для главной функции программы

237
Getter и Setter для указателя

Getter и Setter для указателя

Вопрос заключается в том, как правильно реализовать Getter для указателя, чтобы он был "безопасным"Под безопасностью я подразумеваю предотвращение...

262
Как использовать std::bind с методами класса?

Как использовать std::bind с методами класса?

Пытаюсь использовать std::bind с методом класса:

221