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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.05.2025, 15:12   #1
Женя32
Форумчанин
 
Регистрация: 12.09.2008
Сообщений: 633
Счастье ООП, Стек на основе односвязного списка. Вызвано исключение: нарушение доступа для чтения. this->begin было nullptr

Здравствуйте!
Есть задача:

Цитата:
1) Написать динамический тип данных очередь (первый пришел-первый ушел). Создать на динамическом массиве и на односвязонном списке.
Делаю все также как на виде, но у меня выходит ошибка:

1
D:\Programming\VS\source\repos\Lear ning\x64\Debug\Exercise.exe (процесс 24264) завершил работу с кодом -1073741819.
Нажмите любую клавишу, чтобы закрыть это окно:

Подскажите, пожалуйста, почему выходит такая ошибка?

Queue.h
Код:
#pragma once

// объявляем пространство имен Program
namespace Program
{
	struct queue
	{
		int key;
		queue* next;
		queue* back;
	};

	class queue2
	{
	private:
		queue* begin;
	public:
		queue2(){begin = NULL;}
		
		void Push(int d)
		{
			queue* p = new queue;
			p->key = d;
			p->next = NULL;

			if (begin == NULL)
			{
				begin = p;
				(begin)->back = NULL;
			}
			else
				while (1)
				{
					if ((begin)->next == NULL)
					{
						begin->next = p;
						break;
					}
					queue* temp = begin;
					begin = (begin)->next;
					(begin)->back = temp;
				}

			while (1)
			{
				if (begin->back == NULL)
					break;
				begin = begin->back;
			}
		}

		int Pop()
		{
			int temp = begin->key;
			queue *pv = begin;

			begin = begin->back;
			delete pv;
			return temp;
		}
	};
}
Source.cpp
Код:
#include <conio.h>
#include <iostream>
#include "Queue.h"

using namespace std;

// Объявляем класс queue2 из пространства имен Program
using Program::queue2;

int main()
{
    setlocale(0, "ru");

    queue2 q;

    for (int i(0); i<2; i++)
    {
        q.Push(i+1);
    }

    for (int i(0); i<2; i++)
    {
       cout << q.Pop() << ' ';
    }

    _getch(); 
    return 0; 
}
https://youtu.be/9HgC2Mek_-0?list=PL...zTiX65gs&t=123

Последний раз редактировалось Женя32; 07.05.2025 в 15:21.
Женя32 вне форума Ответить с цитированием
Старый 07.05.2025, 19:37   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,822
По умолчанию

Код:
if ((begin)->next == NULL)
					{
						begin->next = p;
						break;
					}
В этом случае back остается незаполненым. Обычно, для бегания по списку заводят доп. переменную, а не головой бегают туда-сюда.
+Pop у вас из головы элемент вытолкнет и похоронит весь список.
p51x вне форума Ответить с цитированием
Старый 07.05.2025, 20:38   #3
Женя32
Форумчанин
 
Регистрация: 12.09.2008
Сообщений: 633
По умолчанию

Цитата:
Сообщение от p51x Посмотреть сообщение
Код:
if ((begin)->next == NULL)
					{
						begin->next = p;
						break;
					}
В этом случае back остается незаполненым. Обычно, для бегания по списку заводят доп. переменную, а не головой бегают туда-сюда.
+Pop у вас из головы элемент вытолкнет и похоронит весь список.
Ооочень итересно!!! А почему тогда у автора видео этот код работает?
Женя32 вне форума Ответить с цитированием
Старый 07.05.2025, 22:00   #4
Женя32
Форумчанин
 
Регистрация: 12.09.2008
Сообщений: 633
Счастье

На debugger посмотрел, и он говорит, что нарушен доступ для чтения. Но почему?
Изображения
Тип файла: jpg 2025-05-07_23-24-56.jpg (95.1 Кб, 1 просмотров)
Женя32 вне форума Ответить с цитированием
Старый 07.05.2025, 22:54   #5
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,428
По умолчанию

Цитата:
Сообщение от Женя32 Посмотреть сообщение
А почему тогда у автора видео этот код работает?
Потому что у автора видео в методе Pop не "begin = begin->back;", а "begin = begin->next;". Но автор сам говорит, что у него не получилось сделать односвязный список, поэтому он сделал двусвязный. А еще:
Код:
		int Pop()
		{
			if (begin == NULL)
				return 0; // решить, что делать при пустом списке, например, возвращать 0

			int temp = begin->key;
			queue *pv = begin;

			begin = begin->next;
			if (begin != NULL)
				begin->back = NULL; // убрать ссылку на удаляемый элемент списка
			delete pv;
			return temp;
		}
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )
BDA на форуме Ответить с цитированием
Старый 08.05.2025, 10:48   #6
Женя32
Форумчанин
 
Регистрация: 12.09.2008
Сообщений: 633
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Потому что у автора видео в методе Pop не "begin = begin->back;", а "begin = begin->next;".
Спасибо большое. Все заработало!!!
Женя32 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Direct2D.Вызвано исключение по адресу 0x10003C66 (RTSSHooks.dll) в Win32Project1.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0x00000000. Maxim_St Win Api 1 15.04.2019 16:40
Вызвано необработанное исключение: нарушение доступа для чтения. this было nullptr. S.Ruslan Общие вопросы C/C++ 3 11.10.2018 12:22
Нарушение доступа для чтения. Не могу устранить ошибку. Alistra Помощь студентам 5 27.02.2018 14:54
Почему при обращении к структуре из класса возникает исключение:нарушение прав доступа при записи? iron-mik Помощь студентам 2 18.05.2014 01:40
C++ Error Необработанное исключение...нарушение прав доступа Alt_Shift Помощь студентам 1 24.05.2012 12:55