Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.05.2023, 19:49   #1
lenaiv
Пользователь
 
Регистрация: 16.03.2023
Сообщений: 67
По умолчанию Списки С++, выходит ошибка после очистки списка

Пишу программу работы со списками. После очистки списка, если я хочу посмотреть список или начать снова добавлять, то выходят ошибки примерно как на фото или похожие на них. Подскажите как исправить и почему выходят такие ошибки.
Это моя программа:
Код:
#include <iostream>
#include <Windows.h> 
 
using namespace std;
 
 
struct node
{
    int elem; 
    node* next; 
    node* prev; 
};
 
struct lists 
{
private: 
    node* head; 
    node* end; 
    int quanity; 
public: 
    lists() 
    {
        head = end = new node();
        quanity = 0;
    }
 
    int count() 
    {
        return quanity;
    }
 
    node* find(int el)
    {
        node* curr = head->next; 
        while (curr != nullptr) 
        {
            if (curr->elem == el)
            {
                return curr;
            }
            curr = curr->next;
        }
        return nullptr;
    }
 
 
    node* find(int el, node*& aft)
    {
        node* curr = head->next;
        aft = head;
        while (curr != nullptr)
        {
            if (curr->elem == el)
            {
                return curr;
            }
            aft = curr;
            curr = curr->next;
        }
        return nullptr;
    }
 
    bool index(int el, int& ind)
    {
        node* curr = head->next;
        ind = 0;
        while (curr != nullptr)
        {
            if (curr->elem == el)
            {
                return true;
            }
            curr = curr->next;
            ind++;
        }
        return false;
    }
 
    void push_back(int el)
    {
        node* curr = new node();
        curr->elem = el;
        end->next = curr;
        end = curr;
        quanity++;
    }
 
    void push_forward(int el)
    {
        node* curr = new node();
        curr->elem = el;
        curr->next = head->next;
        head->next = curr;
        if (end == head)
        {
            end = curr;
        }
        quanity++;
    }
 
 
    void change(int el1, int el2)
    {
        node* aft;
        node* curr = find(el1, aft);
        if (curr != nullptr)
        {
            curr->elem = el2;
        }
    }
 
 
    void remove(int el)
    {
        node* aft;
        node* curr = find(el, aft); 
 
        if (curr == nullptr)
        {
            return;
        }
 
        if (aft == nullptr)
        {
            head = curr->next;
        }
        else {
            aft->next = curr->next;
        }
        if (curr->next == nullptr) 
        {
            end = aft;
        }
        delete curr;
        quanity--;
    }
 
 
 
    
    void print() const
    {
        if (head->next == nullptr)
        {
            cout << "Список пуст" << endl;
            return;
        }
        node* current = head->next;
        while (current != nullptr)
        {
            cout << current->elem << " ";
            current = current->next;
        }
        cout << endl;
    }
 
    void clear()
    {
        node* current = head;
        while (current != nullptr)
        {
            node* next = current->next;
            delete current;
            current = next;
        }
        head = nullptr;
        end = nullptr;
        quanity = 0;
        cout << "Список успешно очищен." << endl;
    }
};
 
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    lists myList;
    int el, el2;
    int c;
    int choice;
    int ch;
    while (true)
    {
        cout << "Введите команду" << endl;
        cout << "1 - работа с двусвязным списком " << endl;
        cout << "2 - выйти" << endl;
        cin >> ch;
        if (ch == 2)
        {
            exit(0);
            break;
        }
    if (ch == 1)
        {
            while (true)
            {
                cout << "Введите команду" << endl;
                cout << "1 - добавить элемент в конец" << endl;//
                cout << "2 - добавить элемент в начало" << endl;
                cout << "3 - удалить элемент" << endl;
                cout << "4 - изменить элемент" << endl;
                cout << "5 - показать список" << endl;
                cout << "6 - очистить список" << endl;
                cout << "7 - назад" << endl;
                cin >> c;
                if (c == 15)
                {
                    break;
                }
                switch (c)
                {
                case 1:
                    cout << "Введите элемент: ";
                    cin >> el;
                    myList.push_back(el);
                    cout << "Элемент добавлен в конец списка" << endl;
                    break;
                case 2:
                    cout << "Введите элемент: ";
                    cin >> el;
                    myList.push_forward(el);
                    cout << "Элемент добавлен в начало списка" << endl;
                    break;
                case 3:
                    cout << "Введите элемент: ";
                    cin >> el;
                    myList.remove(el);
                    cout << "Элемент удален из списка." << endl;
                    break;
                case 4:
                    cout << "Введите элемент для замены: ";
                    cin >> el;
                    cout << "Введите новое значение элемента: ";
                    cin >> el2;
                    myList.change(el, el2);
                    cout << "Элемент заменен" << endl;
                    break;
 
                case 5:
                    myList.print();
                    break;
                case 6:
                {
                    myList.clear();
                    break;
                }
 
                case 7:
                    break;
                default:
                    cout << "Некорректный ввод. Попробуйте еще раз." << endl;
                    break;
                }
            }
        }
    }
    return 0;
}
А это примерно такие ошибки:
Изображения
Тип файла: jpg Screenshot_20230515_194841.jpg (42.1 Кб, 1 просмотров)

Последний раз редактировалось lenaiv; 15.05.2023 в 19:52.
lenaiv вне форума Ответить с цитированием
Старый 15.05.2023, 20:16   #2
jillitil
Форумчанин
 
Аватар для jillitil
 
Регистрация: 17.10.2018
Сообщений: 184
Радость

Там ведь прямым текстом написано, что у вас голова пустая, а вы всё равно пытаетесь считать с пустой головы:
Код:
  if (head->next == nullptr)
Сначала надо проверить голову, а потом что в ней есть:
Код:
        if (head == nullptr)
        {
            cout << "Список пуст" << endl;
            return;
        }
jillitil вне форума Ответить с цитированием
Старый 15.05.2023, 20:23   #3
lenaiv
Пользователь
 
Регистрация: 16.03.2023
Сообщений: 67
По умолчанию

У меня и в других функциях выходят ошибки, все остальное работает без ошибок, а по этому у меня вся программа не верна? Она работает вроде правильно.
lenaiv вне форума Ответить с цитированием
Старый 15.05.2023, 20:53   #4
lenaiv
Пользователь
 
Регистрация: 16.03.2023
Сообщений: 67
По умолчанию

А как нужно исправить очистку, чтобы не менять, похожие ошибки, в других функциях, потому, что все остальное работает вроде правильно.
lenaiv вне форума Ответить с цитированием
Старый 16.05.2023, 00:00   #5
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,291
По умолчанию

Цитата:
Сообщение от lenaiv Посмотреть сообщение
почему выходят такие ошибки
При создании списка вы сразу добавляете один элемент, а потом пропускаете его, но в функции удаления удаляете все элементы, что ломает логику остальных функций. Я бы переписал всё без использования допэлемента, но можно исправить только очистку:
Код:
    void clear()
    {
        node* current = head->next;
        while (current != nullptr)
        {
            node* next = current->next;
            delete current;
            current = next;
        }
        end = head;
        quanity = 0;
        cout << "Список успешно очищен." << endl;
    }
В функции change aft не нужен. В функции remove случай "aft == nullptr" невозможен, мне кажется.
Цитата:
Сообщение от lenaiv Посмотреть сообщение
1 - работа с двусвязным списком
У вас нет двусвязного списка, только односвязный.
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
динамические структуры(списки). односвязные списки c++ Асдин Помощь студентам 2 16.07.2020 14:18
СПИСКИ!!! BornOfOsiris Помощь студентам 0 19.05.2011 13:20
Списки BornOfOsiris Помощь студентам 0 15.05.2011 15:34
Списки BornOfOsiris Помощь студентам 0 12.05.2011 20:02