Здравствуйте. У меня имеется класс Очередь. В нем необходимо реализовать методы: добавление элемента, удаление элемента, удаление из очереди всех элементов, равных заданному значению.
Код:
#include <iostream>
using namespace std;
struct Node //Структура являющаяся звеном списка
{
int x; //Значение x будет передаваться в список
Node *Next; //Указатели на адреса следующего и предыдущего элементов списка
};
template <class T> class Queue //Создаем тип данных Список
{
Node *Head, *Tail; //Указатели на адреса начала списка и его конца
public:
Queue() :Head(NULL), Tail(NULL){}; //Инициализируем адреса как пустые
~Queue(); //Деструктор
void Show(); //Функция отображения списка на экране
void Add(); //Функция добавления элементов в очередь
void Del(); //Функция удаления элемента из очереди
void DelValue(); //Функция удаления элементов со значениями, равными заданному
};
template <class T> Queue <T>::~Queue() //Деструктор
{
while (Head) //Пока по адресу на начало списка что-то есть
{
Tail = Head->Next; //Резервная копия адреса следующего звена списка
delete Head; //Очистка памяти от первого звена
Head = Tail; //Смена адреса начала на адрес следующего элемента
}
}
template <class T> void Queue <T>::Add()
{
int x(0);
Node *temp = new Node; //Выделение памяти под новый элемент структуры
temp->Next = NULL; //Указываем, что изначально по следующему адресу пусто
cout << "Введите значение элемента: ";
cin >> x;
temp->x = x;//Записываем значение в структуру
if (Head != NULL) //Если список не пуст
{
Tail->Next = temp; //Указываем адрес следующего за хвостом элемента
Tail = temp; //Меняем адрес хвоста
}
else //Если список пустой
{
temp->Next = NULL; //Предыдущий элемент указывает в пустоту
Head = Tail = temp; //Голова=Хвост=тот элемент, что сейчас добавили
}
cout << "Элемент добавлен" << endl;
}
template <class T> void Queue <T>::Del() // Удаление элемента!!!
{
if (Head != NULL) //Пока по адресу на начало списка что-то есть
{
Tail = Head->Next; //Резервная копия адреса следующего звена списка
delete Head; //Очистка памяти от первого звена
Head = Tail; //Смена адреса начала на адрес следующего элемента
cout << "Элемент удален" << endl;
}
else cout << "Очередь пустая" << endl;
}
template <class T> void Queue <T>::DelValue() // Ошибка
{
int number(0);
cout << "Введите значение: ";
cin >> number;
Node *x(0), *temp = new Node;
temp = Head;
while (temp != NULL) // Пока не конец списка
{
if (temp->x == number) //Если элемент равен заданному значению
{
if (temp->Next != NULL) // Если следующий элемент не последний
{
temp->x;
temp = temp->Next; //Сохраняем адрес следующего элемента
delete x;
temp->Next = temp->Next->Next; // Ошибка
cout << "Элемент удален";
}
else
{
delete x;
temp = NULL;
cout << "Элемент удален";
}
}
}
}
template <class T> void Queue <T>::Show()
{
if (Head == NULL) cout << "Очередь пустая";
else
{
Node *temp = new Node;
temp = Head; //Временно указываем на адрес первого элемента
while (temp != NULL) //Пока не встретим пустое значение
{
cout << temp->x << " "; //Выводим каждое считанное значение на экран
temp = temp->Next; //Смена адреса на адрес следующего элемента
}
}
}
int main()
{
setlocale(LC_ALL, "Russian");
system("CLS");
Queue<int> que; //Объявляем переменную, тип которой есть список
char number;
do
{
cout << "1. Добавить элемент" << endl;
cout << "2. Удалить элемент" << endl;
cout << "3. Вывести очередь" << endl;
cout << "4. Удалить элементы, равные элементу с заданным значением" << endl;
cout << "0. Выйти\n\n";
cout << "Номер команды > "; cin >> number;
switch (number)
{
case '1':
cout << endl;
que.Add();
cout << endl;
break;
//-----------------------------------------------
case '2':
que.Del();
cout << endl;
break;
//-----------------------------------------------
case '3':
cout << endl;
que.Show();
cout << endl << endl;
break;
//-----------------------------------------------
case '4':
cout << endl;
que.DelValue();
cout << endl << endl;
break;
//-----------------------------------------------
case '0': break;
default: cout << endl << "Команда не определена\n\n";
break;
}
} while (number != '0');
system("pause");
return 0;
}
Проблема в том, что не работает последний метод, который должен удалять элементы с заданным значением (DelValue). Подскажите, пожалуйста, что и как исправить?