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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.05.2020, 15:58   #1
garden_rgb
Новичок
Джуниор
 
Регистрация: 02.05.2020
Сообщений: 1
По умолчанию Удаление элементов с четными числами из однонаправленного списка типа Стек (C++)

После выбора действия удаления четных чисел в самой программе, вызывается исключение в 28 строке: "нарушение доступа для чтения.
t было 0xDDDDDDDD".
Код:
#include <iostream>
#include <ctime>
using namespace std;

struct Stack {
	int info;
	Stack* next;
};

Stack* push(Stack* p, int in) {
	Stack* t = new Stack;
	t->info = in;
	t->next = p;
	return t;
}

Stack* pop(Stack* p, int& out) {
	Stack* t = p;
	out = p->info;
	p = p->next;
	delete t;
	return p;
};

void view(Stack* p) {
	Stack* t = p;
	while (t) { // работает, потому что на конце стека t = NULL, что в if воспринимается как false
		cout << t->info << endl;	// исключение тут
		t = t->next;
	}
}

void deleteAll(Stack** p) {
	Stack* buf;
	while (*p != NULL) {
		buf = *p;
		*p = (*p)->next;
		delete buf;
	}
}

void sortStack(Stack* p) {
	Stack* t = NULL, * t1;
	int buf;
	while (p->next != t) {
		for (t1 = p; t1->next != t; t1 = t1->next)
			if (t1->info > t1->next->info) {
				buf = t1->info;
				t1->info = t1->next->info;
				t1->next->info = buf;
			}
		t = t1;
	}
}

 Stack* DelEven(Stack* p) {        //удаление элементов с четными числами
	Stack* t = p;
	Stack* t1 = p;
	while (t != NULL) {
		if (t->info % 2 != 0) {
			t1 = t;
			t = t->next;
		}
		else {
			if (t == p) {
				p = p->next;
				delete t;
				return p;
			}
			else {
				t1->next = t->next;
				delete t;
				t = t1->next;
			}
		}
	}
}

		
int main()
{
	srand(time(NULL));
	Stack* my_stack = NULL;
	int num;
	while (true)
	{
		if (my_stack) {
			cout << '\n' << "Current stack:" << '\n';
			view(my_stack);
		};
		if (my_stack != NULL)
		{
			cout << '\n';
		}
		cout << "Enter 1 to fill up the stack with random numbers" << '\n' <<
			"Enter 2 to eject an element from the stack" << '\n' <<
			"Enter 3 to clear all stack" << '\n' <<
			"Enter 4 to delete even numbers" << '\n' <<
			"Enter 5 to exit" << '\n' <<
			"Enter 6 to sort the stack" << '\n';
		cin >> num;
		cout << '\n';
		switch (num) {
		case 1:
		{
			cout << "Enter the stack size" << endl;
			int size;
			cin >> size;
			for (int i = 0; i < size; i++)
			{
				my_stack = push(my_stack, rand() % 200 - 100);
			}
			break;
		}
		case 2:
		{
			int a;
			my_stack = pop(my_stack, a);
			cout << a << " was ejected" << endl;
			system("pause");
			break;
		}
		case 3:
		{
			deleteAll(&my_stack);
			break;
		}
		case 4:		//удаление четных чисел
		{
			system("cls");
			cout << "Old stack:" << endl;
			view(my_stack);
			DelEven(my_stack);
			cout << endl << "New stack:" << endl;
			view(my_stack);
			system("pause");
			break;
		}
		case 5:
		{
			deleteAll(&my_stack);
			return 0;
		}
		case 6:
		{
			sortStack(my_stack);
		}
		}
		system("cls");
	}

}
garden_rgb вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Удаление элементов из списка Ko1iN Общие вопросы C/C++ 0 08.01.2018 18:40
Создать стек из случайных целых чисел и удалить из него записи с четными числами scarecrow_1 Паскаль, Turbo Pascal, PascalABC.NET 1 05.05.2016 17:12
Удаление элементов массива с четными индексами DoGFoX Общие вопросы C/C++ 2 12.12.2013 11:12
Delphi. Программно организовать очередь в виде однонаправленного списка из элементов типа rec alexanderrrr Помощь студентам 0 29.04.2013 22:04
удаление циклического однонаправленного списка.. Yakoot Visual C++ 9 18.06.2011 20:05