Нарушение прав доступа - невозможно записать в местоположение - PullRequest
0 голосов
/ 26 марта 2012

Я пытаюсь написать код для связанного списка, но когда я пытаюсь добавить узел, код застревает в строке сразу после цикла while в функции add (), сообщая об ошибке нарушения доступа.Что не так?

#include<iostream>

template <class T>
class linkedlist
{
    struct node
    {
        T data;
        node *lp;
    }*p;
public:
    linkedlist();
    void add(T t);
};

template<class T>
void linkedlist<T>::add(T t)
{
    node *r,*q;
    r = q = p;

    while(p!= NULL)
    {
        q = p;
        p = p->lp;
    }

    q->lp = new node;
    q->lp->data = t;
    p = r;
}

template<class T>
linkedlist<T>::linkedlist()
{
    p = NULL;
}

int main()
{
    linkedlist<int> l1;
    l1.add(3);
}

Ответы [ 2 ]

1 голос
/ 26 марта 2012

Вы инициализируете p в NULL в конструкторе, затем пытаетесь разыменовать его в add (через q):

r = q = p;
// the while loop will not be executed as p == NULL
q->lp = new node;

Сначала необходимо инициализировать p - либово время конструирования (в этом случае ваш «пустой» список не будет физически пустым, поэтому вы должны иметь дело именно с этим, например, при переборе / удалении элементов), или вы должны проверить add для случая, когда p == null иобрабатывать его по-разному.

Примечание: p должен указывать на элемент head, поэтому рискованно использовать его также для перебора списка в add, а затем восстановления его исходного значения (сохраненов r).Почему бы просто не оставить его без изменений и использовать r для итерации?Еще один шанс для ошибок.

0 голосов
/ 26 марта 2012

Вы должны инициализировать узел в конструкторе:

p = new Node;

Потому что здесь:

while(p!= NULL)
{
    q = p;
    p = p->lp;
}

q->lp = new node;

p изначально NULL, поэтому q также будет NULL, следовательно q->lp приводит к неопределенному поведению и падению.

Либо инициализируйте p, либо заново продумайте свою логику.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...