Удаление последнего элемента в двусвязном списке 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--;
}
В конце самом хвост указывает сам на себя, без добавления значения в основной список.
