Проблема в двусвязном списке C++

Рейтинг: 0Ответов: 1Опубликовано: 12.03.2023

Есть код на C++, Задание Дана последовательность целых чисел. Маркер конца ввода – число ноль. Сформировать на основе данной последовательности двунаправленный список. Удалить из списка элементы, расположенные после чётных чисел. При тесте ВВОД: 1 2 3 4 5 6 7 Выводи 1 2 4 6 Все верно НО если Ввести 3 4 6 8 12 5 выводи 3 4 6 8 12, а должен 3 4 8 5 Помогите исправить проблему,спасибо заранее

using namespace std;

struct list {
    int info;
    list* next;
    list* pred;
};

int main() {
    setlocale(LC_ALL, "rus");

    list* head = NULL;
    list* last = NULL;

    int x;
    cout << "Введите элементы: " << endl;
    cin >> x;

    if (x != 0) {
        head = new list;
        head->info = x;
        head->next = NULL;
        head->pred = NULL;
        last = head;
        cin >> x;

        while (x != 0) {
            list* r = new list;
            r->info = x;
            r->next = NULL;
            r->pred = last;
            last->next = r;
            last = r;

            cin >> x;
        }
    }

    cout << "Вывод списка: " << endl;

    list* p = head;

    while (p != NULL) {
        cout << (p->info) << " ";
        p = p->next;
    }
    cout << endl;

    bool even_found = false;

    p = head;

    while (p != NULL) {
        if (p->info % 2 == 0) {
            even_found = true;
        }
        else if (even_found) {
            list* l = p;
            p->pred->next = p->next;
            if (p->next != NULL) {
                p->next->pred = p->pred;
            }
            p = p->pred;
            delete l;
        }
        p = p->next;
    }

    cout << "Вывод нового списка: " << endl;

    p = head;

    while (p != NULL) {
        cout << (p->info) << " ";
        p = p->next;
    }

    while (head != NULL) {
        p = head;
        head = head->next;
        delete p;
    }

    return 0;
}

Ответы

▲ 1Принят

Попробуйте так:

while (p != NULL) {
    if (even_found) {
        list* l = p;
        p->pred->next = p->next;
        if (p->next != NULL) {
            p->next->pred = p->pred;
        }
        p = p->pred;
        delete l;
        even_found = false;
    }
    else if (p->info % 2 == 0) {
        even_found = true;
    }

    p = p->next;
}