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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 26.02.2015, 17:46   #1
WolfMan96
Новичок
Джуниор
 
Регистрация: 26.02.2015
Сообщений: 2
По умолчанию Помогите доработать программу.

Здравствуйте. У меня имеется класс Очередь. В нем необходимо реализовать методы: добавление элемента, удаление элемента, удаление из очереди всех элементов, равных заданному значению.

Код:
#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). Подскажите, пожалуйста, что и как исправить?

Последний раз редактировалось WolfMan96; 26.02.2015 в 17:51.
WolfMan96 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Анимация. Помогите доработать программу. pavelre Помощь студентам 0 15.10.2014 20:53
помогите доработать программу alexlagunov Visual C++ 19 28.04.2014 12:18
Помогите доработать программу. Паскаль Руслан56 Помощь студентам 0 11.03.2014 20:00
Помогите доработать программу, заполнить массив случайными значениями . serg.malkow2014 Помощь студентам 2 27.11.2013 01:41