@s1rGAY

Нарушение прав доступа при нахождении наибольшего элемента двусвязного списка. Как решить данную проблему?

Имеется класс двусвязного списка :
(Деструкторы класса не упомянуты тк очень маловероятно, что проблема в них)
class Double_Linked_List
{
    int Size;//кол-во эл-тов списка
    struct Node
    {
        int data;
        Node *pNext,*pPrev;
        Node(int data=0, Node *pNext=nullptr,Node *pPrev=nullptr)
        {
            this->data=data;
            this->pNext= pNext;
            this->pPrev=pPrev;
        }
    };
public: 
    int GetSize(){return Size;};
    void task();
    void removeAt(int index);
    void push_back(int data);//добавление в конец

    Node *head,*tail; //head - первый элемент списка, tail - последний
};

Заполняется при помощи метода push_back :
void Double_Linked_List::push_back(int data)
{
    if(head==nullptr)//проверяем существует ли первый элемент
    {
        head = new Node(data); //создаем первый элемент
        tail = head; // тк элемент является единственным ,то он же и будет последним
    }
    else
    {
        Node *current = tail;//временный указатель на хвост
        tail= new Node(data);//создаем новый tail;
        tail->pPrev=current;//присваиваем указатель на предыдущий элемент нового хвоста (им является прошлый tail)
        tail->pNext=nullptr;//у нового хвоста указатель равен nullptr
        current->pNext=tail;
    }
    Size++;
}

По заданию надо удалить наибольший элемент из списка, я делаю это при помощи метода removeAt, передавая в него индекс наибольшего элемента. Индекс определяю следующим методом :
(Данный метод был написан для односвязного списка, но его по логике можно применять и к двусвязному списку, тк алгоритм поиска ничем не отличается и наличие дополнительной связи на него не влияет)
void Double_Linked_List::task()
{
	int con = 0,index=0;

	Node* current = this->head;
	int dat = current->data;

	while (current->data!= nullptr) 
	{
		if (current->data >= dat) 
		{
			dat = current->data;
			index = con;
		}
		current = current->pNext;
		con++;
	}
	cout << "Index of the largest element : " << index << endl
		<< "Element : " << dat << endl;
	removeAt(index);
}

Через раз выдает ошибку "Вызвано исключение: нарушение доступа для чтения.
current было 0xDDDDDDDD." На строчке с циклом while. При совершенно разных значениях (и вроде бы никак между собой не связанных)
  • Вопрос задан
  • 55 просмотров
Пригласить эксперта
Ответы на вопрос 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Вы не инициализируете head и tail в Double_Linked_List. Если, конечно, вы просто не вырезали конструктор в вашем вопросе.

Еще, при поиске максимального элемента в условии цикла надо смотреть, что current не nullptr, а не то, что у него есть следующий. Вы так последний элемент в цикле никогда не посмотрите.

И удалять надо не по индексу, надо передавать указатель. Зачем второй раз проходится по списку и искать значение, если у вас уже есть сам элемент?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
ЧИТАЙ-ГОРОД Москва
от 120 000 до 140 000 ₽
от 120 000 до 180 000 ₽
NTWS.PRO Санкт-Петербург
от 45 000 ₽
22 июн. 2021, в 13:07
125000 руб./за проект
22 июн. 2021, в 13:06
165000 руб./за проект
22 июн. 2021, в 13:02
25000 руб./за проект