Удаление последнего элемента в двусвязном списке C++

Никак не получается правильно сдвинуть хвост при удалении последнего элемента. То есть если список, к примеру, состоит из последовательности чисел 1 2 3 4, и нужно удалить цифру 4, то все будет нормально, но при добавлении нового элемента после удаления меняется только указатель Tail, а сам список как будто не добавляет новую ячейку. Удаление Head и из середины работают. У меня получается так, что хвост указывает сам на себя.Помогите найти ошибку. Делаю без классов, потому что такое задание (удалить ячейку списка по заданному значению).

#include <windows.h> 
#include <iostream>

using namespace std;

struct DualList {
    DualList* previous;
    DualList* next;
    int id;
    float data;
};

DualList* Head;
DualList* Tail;
DualList* Current;
DualList* Previous;
DualList* Temp;
int count0 = -1;


void Print() {
    if (count0 == -1) {
        cout << "Список пуст! " << endl;
        return;
    }
    DualList* l = Head;
    cout << "Адрес головы: " << Head << ", значение головы " << Head->data << ", id головы " << Head->id << ", следующий адрес " << Head->next << endl;
    while (l != NULL) {
        cout << "Адрес ячейки: " << l << ", значение ячейки " << l->data << ", id ячейки " << l->id << ", предыдущий адрес " << l->previous << ", следующий адрес "
            << l->next << endl;
        l = l->next;
    }
    cout << "Адрес хвоста: " << Tail << ", значение хвоста " << Tail->data << ", id хвоста " << Tail->id << ", предыдущий адрес " << Tail->previous << endl;
}

void InputValue() {
    Current = new DualList;
    cin >> Current->data;

    if (count0 == -1) {
        count0++;
        Current->id = count0;
        Head = Current;
        Head->previous = NULL;
        Tail = Current;
        Previous = Current;
        Temp = Current;
        Current->next = NULL;
    }
    else {
        count0++;
        Current->id = count0;
        Tail = Current;
        Current->previous = Temp;
        Previous->next = Current;
        Previous = Current;
        Temp = Current;
        Current->next = NULL;
    }

}
int CountValues() {
    return count0 + 1;
}

void DeleteValue(DualList* l) {
    if (l->previous == NULL) {

        if (l->next != NULL) {
            Head = l->next;
            Head->next = l->next->next;
            Head->previous = NULL;
        }
        else
            Head = NULL;

    }
    else if (l->next == NULL) {
        Tail = l->previous;
        l->previous->next = NULL;
    }
    else {
        l->previous->next = l->next;
        l->next->previous = l->previous;

    }
    delete l;

    count0--;
}

void SearchId() {
    if (count0 == -1) {
        cout << "Список пуст! " << endl;
        return;
    }
    float val;
    cin >> val;
    DualList* l = Head;

    while (l != NULL) {
        if (l->data == val) {
            cout << "Желаете удалить элемент в ячейке с id " << l->id << "?(0/1)" << endl;
            int ans = -1;
            int pos = l->id;
            while (ans != 1 && ans != 0) {
                cout << "Введите (0/1)" << endl;
                cin >> ans;
            }
            if (ans == 1) {
                DeleteValue(l);
                cout << "Удален элменет " << val << " с id " << pos << endl;
                return;
            }
        }
        l = l->next;
    }
    cout << "Такого элемента нет, или вы ничего не выбрали" << endl;
}

int SelectMenu(char* x[])
{
    int q;
    for (int i = 0; i < 4; i++)
        cout << x[i];
    cin >> q;
    return q;
}

char m1[] = { "1. Ввод элемента :\n" };
char m2[] = { "2. Удаление элемента по его значению :\n" };
char m3[] = { "3. Печать списка :\n" };
char m4[] = { "4. Выход :\n" };
char* menu[] = { m1,m2,m3,m4 };


int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);

    bool flag = true;
    while (flag) {
        switch (SelectMenu(menu)) {
        case 1:
            InputValue();
            break;
        case 2:
            SearchId();
            break;
        case 3:
            Print();
            break;
        case 4:
            flag = false;
            break;
        default:
            cout << "Нет такого пункта меню, повторите попытку" << endl;
            break;
        }

    }

    return 0;
}

Проблема в этом блоке:

void DeleteValue(DualList* l) {
    if (l->previous == NULL) {

        if (l->next != NULL) {
            Head = l->next;
            Head->next = l->next->next;
            Head->previous = NULL;
        }
        else
            Head = NULL;

    }
    else if (l->next == NULL) {
        l->previous->next = NULL;
        Tail = l->previous;
    }
    else {
        l->previous->next = l->next;
        l->next->previous = l->previous;

    }
    delete l;

    count0--;
}

UPD введите сюда описание изображения

В конце самом хвост указывает сам на себя, без добавления значения в основной список.


Ответы (0 шт):