Возникло исключение: нарушение прав записи (this-> tail was nullptr) - PullRequest
0 голосов
/ 11 октября 2018

Я скомпилировал свой код, и он, кажется, работал правильно.Но откуда-то я получаю ошибку (this-> tail был nullptr).Я попытался изменить создание нового узла.Но, похоже, ничего не работает.Я не могу сказать, где для tail задано значение nullptr и что он испортил код.

Как мне решить эту проблему?Есть ли способ установить tail в non-nullptr, не разрушая все остальные функции?Я не слишком знаком с генерацией исключений, поэтому, если бы вы могли объяснить ситуацию, это очень помогло бы.

#ifndef MYDLL_H
#define MYDLL_H

#include <iostream>
#include <new>
using namespace std;

class MyDLL
{
    struct Node
{
    int i;
    Node* next;
    Node* prev;
};

Node* head;
Node* tail;

public:
MyDLL();
~MyDLL();
void append(int);
void remove(int);
bool find(int) const;
void clear();
void print() const;
void reverse() const;
};

MyDLL::MyDLL()
{
head = nullptr;
tail = nullptr;
}
MyDLL::~MyDLL()
{
clear();
}

void MyDLL::append(int i)
{
    Node *n = new Node{ i, nullptr, nullptr };
if (head = nullptr)
{
    head = n;
    tail = n;
}
else
{
    n->prev = tail;
    tail->next = n; **<--- This is where the exception thrown error is showing up**
    tail = n;
}
}

void MyDLL::remove(int i)
{
Node* p = head;
Node* q = tail;

while (p != nullptr && p->i != i)
{
    q = p;
    p = p->next;
}

if (p = nullptr)
{
    return;
}

if (q = nullptr)
{
    head = p->next;
}
else
{
    q->next = p->next;
}

if (p->next = 0)
{
    tail = q;
}
else
{
    p->next->prev = q;
}
delete(p);
}

bool MyDLL::find(int i) const
{
Node* p = tail;

while (p != nullptr)
{
    if (p->i = i)
    {
        return (true);
    }
    p = p->prev;
}
return (false);
}

void MyDLL::clear()
{
while (tail != nullptr)
{
    Node* p = tail;
    tail = p->prev;
    delete (p);
}
head = nullptr;
}

void MyDLL::print() const
{
Node* p = head;

while (p)
{
    cout << p->i << "\t";
    p = p->next;
}
cout << "\n";
}

void MyDLL::reverse() const
{
Node* p = tail;

while (p)
{
    cout << p->i << "\t";
    p = p->prev;
}
cout << "\n";
}
#endif

int main()
{
    MyDLL list;
list.append(5);
list.append(6);
list.append(7);
list.append(8);

list.print();
list.reverse();
cout << system("pause");
}

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Пожалуйста, исправьте = с == в вашем коде.

void MyDLL::append(int i)
{
    Node *n = new Node{ i, nullptr, nullptr };
    if (head == nullptr)

Всегда рекомендуется делать как обратное сравнение (nullptr == head)

0 голосов
/ 11 октября 2018

Этот код именно поэтому вы хотите использовать nullptr = tail вместо tail = nullptr.В частности, каждый раз, когда вы «проверяете», чтобы tail был нулевым указателем, вы присваиваете nullptr параметру tail, а затем оператор assign возвращает значение, которое затем неявно преобразуется в логическое значение, что не вызывает ошибок.Но ошибка на самом деле есть.Замените оператор "=" на "==" при выполнении сравнения, если только у вас нет причины присваивать и проверять возвращаемое значение.

...