Скачиваний:
9
Добавлен:
03.11.2022
Размер:
8.63 Кб
Скачать
// stacks_3lbl.cpp : Этот файл содержит функцию "main". Здесь начинается и заканчивается выполнение программы.
//
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>

using namespace std;

struct obj {
	int item;
	obj* next, * prev;
};
//прототипы функций
void push(obj**, obj**, int);
void push_to_start(obj**, obj**, int);
void view(obj**,int);
void clear(obj**); //очистка очереди
obj* del_x2(obj**, obj**);

int main()
{
	setlocale(LC_ALL, "Russian");
	obj* begin = NULL;
	obj* end = NULL;
	play:
	cout << "1. Создать новую очередь " << endl;
	cout << "2. Просмотреть очередь" << endl;
	cout << "3. Добавить в очередь " << endl;
	cout << "4. Выйти " << endl;
	cout << endl;
	cout << "5. Задание удалить из очереди максимальное "<< endl;

	int a = 0;
	cin >> a;
	int b; // нужен для выбора пользователем

	switch (a)
	{
	case 1:
		if (begin != NULL) // если очередь пуста
		{
			cout << "Очередь уже создана" << endl;
		repeat1:
			cout << "Вернуться назад или выйти?" << endl;
			cout << "1. Да" << endl;
			cout << "2. Нет" << endl;
			cin >> b;
			switch (b)
			{
			case 1:
				system("cls");
				goto play;
			case 2: return 0;
			default:
				system("cls");
				goto repeat1;
			}
		}
		else
		{
		err:
			cout << "Введите длину очереди" << endl;
			int l = 0;
			cin >> l;
			if (l < 1)
			{
				cout << "Ошибочная длина очереди!" << endl;
				goto err;
			}
			for (int i = 0; i < l; i++)
			{
				push(&begin, &end, (-10 + (rand() % 21))); // генерация случайных чисел от -10 до 10 и вызов функции
			}
			cout << "Ваша очередь:" << endl;
			view(&begin, 1);
			cout << endl;
		repeat2:
			cout << "Желаете вернуться или выйти?" << endl;
			cout << "1. Да" << endl;
			cout << "2. Нет" << endl;
			cin >> b;
			switch (b)
			{
			case 1:
				system("cls");
				goto play;
			case 2: return 0;
			default:
				system("cls");
				goto repeat2;
			}
		}
	case 2:
		if (begin == NULL)
		{
			cout << "Очередь пуста!" << endl;
		repeat3:
			cout << "Желаете вернуться или выйти? " << endl;
			cout << "1. Да" << endl;
			cout << "2. Нет" << endl;
			cin >> b;
			switch (b)
			{
			case 1:
				system("cls");
				goto play;
			case 2: return 0;
			default:
				system("cls");
				goto repeat3;
			}
		}
		else
		{
			cout << "Как вы желаете просмотреть очередь?" << endl;
		er0:
			cout << "1. С начала в конец" << endl;
			cout << "2. С конца в начало" << endl;
			cin >> b;
			switch (b)
			{
			case 1:
				cout << "Ваша очередь!" << endl;
				view(&begin, 1);
			er:
				cout << "Желаете вернуться или выйти? " << endl;
				cout << "1. Да" << endl;
				cout << "2. Нет" << endl;
				cin >> b;
				switch (b)
				{
				case 1:
					system("cls");
					goto play;
				case 2: return 0;
				default:
					system("cls");
					goto er;
				}
			case 2:
				cout << "Ваша очередь!" << endl;
				view(&end, 2);
			er2:
				cout << "Желаете вернуться или выйти? " << endl;
				cout << "1. Да" << endl;
				cout << "2. Нет" << endl;
				cin >> b;
				switch (b)
				{
				case 1:
					system("cls");
					goto play;
				case 2: return 0;
				default:
					system("cls");
					goto er2;
				}

			default:
				system("cls");
				goto er0;
			}


	case 3:
		if (begin == NULL)
		{
			cout << "Очередь пуста!" << endl;
		repeat5:
			cout << "Желаете вернуться или выйти? " << endl;
			cout << "1. Да" << endl;
			cout << "2. Нет" << endl;
			cin >> b;
			switch (b)
			{
			case 1:
				system("cls");
				goto play;
			case 2: return 0;
			default:
				system("cls");
				goto repeat5;
			}
		}
		else
		{
			cout << "Какую цифры вы хотите добавить?" << endl;
			int numb;
			cin >> numb;
		errt:
			cout << "Куда вы хотите добавить?" << endl;
			cout << "1. В начало" << endl;
			cout << "2. В конец" << endl;
			cin >> b;
			switch (b)
			{
			case 1:
				push_to_start(&begin, &end, numb);
				ttr:
				cout << "Желаете вернуться или выйти? " << endl;
				cout << "1. Да" << endl;
				cout << "2. Нет" << endl;
				cin >> b;
				switch (b)
				{
				case 1:
					system("cls");
					goto play;
				case 2: return 0;
				default:
					system("cls");
					goto ttr;
				}

			case 2:
				push(&begin, &end, numb);
				ttr1:
				cout << "Желаете вернуться или выйти? " << endl;
				cout << "1. Да" << endl;
				cout << "2. Нет" << endl;
				cin >> b;
				switch (b)
				{
				case 1:
					system("cls");
					goto play;
				case 2: return 0;
				default:
					system("cls");
					goto ttr1;
				}

			default:
				system("cls");
				goto errt;

			}

		}

	case 4:
		return 0;
	case 5:
		if (begin == NULL)
		{
			cout << "Очередь пуста!" << endl;
			repeat9:
			cout << "Желаете вернуться или выйти? " << endl;
			cout << "1. Да" << endl;
			cout << "2. Нет" << endl;
			cin >> b;
			switch (b)
			{
			case 1:
				system("cls");
				goto play;
			case 2: return 0;
			default:
				system("cls");
				goto repeat9;
			}
		}
		else
		{

			begin = del_x2(&begin, &end);
			view(&begin, 1);
			repeat56:
			cout << "Желаете вернуться или выйти? " << endl;
			cout << "1. Да" << endl;
			cout << "2. Нет" << endl;
			cin >> b;
			switch (b)
			{
			case 1:
				system("cls");
				goto play;
			case 2: return 0;
			default:
				system("cls");
				goto repeat56;
			}

		}

	default:
		system("cls");
		goto play;
		}

	}
}
void push_to_start(obj** begin, obj** end, int numb)
{
	obj* q = new obj();
	q->item = numb;
	q->next = *begin;
	q->prev = NULL;
	(*begin)->prev = q;
	*begin = q;
	q = NULL;
	free(q);
}
obj* del_x2(obj**begin,obj**end)
{
	if (*begin == *end)
	{
		cout << "Ошибка один элемент не может быть максимумом!" << endl;
		return *begin;
	}
	obj* start = *begin;
	obj* q = *begin;
	obj* prev = NULL;
	int max = 0;
	while (q != NULL)
	{
		if (q->item > max)
		{
			max = q->item;
		}
		else
		{
			q = q->next;
		}
	}
	q = *begin;
	while (q != NULL)
	{
		if (q == start && q->item == max)
		{
			prev = q->next;
			q = NULL;
			free(q);
			q = prev;
			prev = NULL;
			start = q;
		}
		if (q->item==max)
		{
			prev = q->prev;
			prev->next = q->next;
			q = NULL;
			free(q);
			q = prev->next;
			if (q != NULL)
			{
				q->prev = prev;
			}
		}
		else
		{
			q = q->next;
		}
	}
	return start;
}
void push(obj** begin, obj** end, int number)
{
	obj* q = new obj();
	if (*begin == NULL)
	{
		q->item = number;
		q->prev = NULL;
		q->next = NULL;
		*begin = q;
		*end = q;
		q = NULL;
		free(q);
	}
	else
	{
		if ((*end)->prev == NULL)
		{
			q->item = number;
			q->prev = *begin;
			q->next = NULL;
			*end = q;
			q = NULL;
			free(q);
			(*begin)->next = *end;
		}
		else
		{
			q->item = number;
			q->prev = *end;
			q->next = NULL;
			(*end)->next = q;
			*end = q;
			q = NULL;
			free(q);

		}
	}
}
void clear(obj** begin)
{
	obj* q = *begin;
	while (*begin != NULL)
	{
		// q следующий в стеке а тот, что вершина я зануляю а потом методом free чищу b и перетаскиваю вершину на q
		q = (*begin)->next;
		(*begin)->item = NULL;
		(*begin)->next = NULL;
		free(*begin);
		*begin = q;
	}
}


void view(obj** begin,int r) //запись в консоль стэка
{
	obj* q = *begin;
	if (r == 1)
	{
		while (q != NULL) // пока q не NULL
		{
			cout << "\t" << q->item;
			q = q->next;
			cout << endl;
		}
	}
	else if (r == 2)
	{
		while (q != NULL) // пока q не NULL
		{
			cout << "\t" << q->item;
			q = q->prev;
			cout << endl;
		}
	}

}
Соседние файлы в папке 1 курс различные лабы и их куски. Что-то полезное тут есть