Справка по связанному списку C ++ (указатели)? - PullRequest
0 голосов
/ 13 октября 2011
template <typename T>
class LinkedNode
{
public:
    T data;
    LinkedNode<T> *next;
    LinkedNode<T> *prev;
    LinkedNode<T>();
    LinkedNode<T>(T);
};

// Default constructor
template <typename T>
LinkedNode<T>::LinkedNode()
{
    next = NULL;
    prev = NULL;
}



template <typename T>
class LinkedList
{
private:
    LinkedNode<T> *head;
public:
    LinkedList<T>();
    ~LinkedList<T>();
    void addFront(T);
    void addBack(T);
    void addAt(T, int);
    void removeFront();
    void removeBack();
    void removeAt(int);
    void printList();
};

// Constructor
template <typename T>
LinkedList<T>::LinkedList()
{
    head = NULL;
}

// Add new node to front
template <typename T>
void LinkedList<T>::addFront(T d)
{
    LinkedNode<T> temp;
    temp.data = d;

    if (head == NULL)
    {
        head = &temp;
    }
    else
    {
        temp.next = head;
        head->prev = &temp;
        head = &temp;
    }
}

// Add new node to back
template <typename T>
void LinkedList<T>::addBack(T d)
{
    // Find the back of this list
    LinkedNode<T> *ptr;
    ptr = head;

    while (ptr->next != NULL) // <------- DIES HERE, MEMORY ACCESS VIOLATION
    {
        ptr = ptr->next;
    }

    // Make a new node and join it to the back
    LinkedNode<T> temp;
    temp.data = d;
    temp.prev = ptr;
    ptr->next = &temp;
}

Вот фрагмент из моей системы связанных списков.Проблема в том, что он выдает ошибку в указанной строке.Отладчик говорит, что указатель «head» указывает на допустимый адрес памяти LinkedNode без «next» или «prev», но указатель «ptr» указывает на адрес 0xcccccc, а не на адрес head?Я действительно запутался, я думал, что понял указатели!

Ответы [ 2 ]

5 голосов
/ 13 октября 2011
void LinkedList<T>::addFront(T d)
{
    LinkedNode<T> temp;
    temp.data = d;
    ...
    head = &temp;
    ...
}

temp - переменная автоматического хранения, срок ее службы истечет, как только вернется функция addFront, и вы получите указатель на недопустимый объект.Вы должны выделить узлы в куче, вместо этого сделайте следующее:

    LinkedNode<T>* temp = new LinkedNode<T>;
    temp->data = d;
    ...
    head = temp;
1 голос
/ 13 октября 2011

Подтверждаю ответом из К-балла.Проблема в том, что добавляемый вами объект уничтожается, когда функция addFront выходит из области видимости.У вас есть список недействительных указателей.

Выделите элементы с новыми, как показано выше, но не забудьте очистить их при удалении элемента из списка (удалить указатель).

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