общий доступ к указателю на связанный список - PullRequest
0 голосов
/ 03 октября 2011

Я пишу общий связанный список в C ++ с использованием шаблонов и испытываю ошибки сегментации при доступе к значениям узла.

Чтобы упростить тест, я реализовал фиксированный размер, два узла, связанный список.

У меня есть два вопроса:

1a) Почему aList.headNodePtr-> prevNodePtr не установлен в NULL?

1b) Почему не aList.tailNodePtr-> nextNodePtr установлен в NULL?

Я установил оба этих значения в NULL в конструкторе LinkedList, но вывод в main показывает, что:

head prevAddress: 0x89485ed18949ed31
tail nextAddress: 0x7fffe8849679

2) Почему следующая строка вmain () вызывает ошибку сегмента?

aList.headNodePtr->nodeValue = 1;

Полный код приведен ниже:

#include <iostream>
using namespace std;

template <class T>
    class Node {
    public:
    Node<T>* prevNodePtr;
    Node<T>* nextNodePtr;
    T nodeValue;
};

template <typename T>
    class LinkedList {
    public:
    Node<T>* headNodePtr;
    Node<T>* tailNodePtr;

    LinkedList() {
        Node<T>* headNodePtr = new Node<T>;
        Node<T>* tailNodePtr = new Node<T>;

        headNodePtr->prevNodePtr = NULL;
        headNodePtr->nextNodePtr = tailNodePtr;
        tailNodePtr->prevNodePtr = headNodePtr;
        tailNodePtr->nextNodePtr = NULL;
    }

    ~LinkedList() {
        headNodePtr = NULL;
        tailNodePtr = NULL;
        delete headNodePtr;
        delete tailNodePtr;
    }
};

int main()
{
    LinkedList<int> aList;
    cout << "head Value: " << aList.headNodePtr->nodeValue << endl;
    cout << "head prevAddress: " << aList.headNodePtr->prevNodePtr << endl;
    cout << "head nextAddress: " << aList.headNodePtr->nextNodePtr << endl;
    cout << "tail Value: " << aList.tailNodePtr->nodeValue << endl;
    cout << "tail prevAddress: " << aList.tailNodePtr->prevNodePtr << endl;
    cout << "tail nextAddress: " << aList.tailNodePtr->nextNodePtr << endl;

    aList.headNodePtr->nodeValue = 1;
}

1 Ответ

2 голосов
/ 03 октября 2011

Вы на самом деле не устанавливаете участников, вы устанавливаете местных жителей, которых вы объявили в ctor:

Node<T>* headNodePtr;  // <-- MEMBERS
Node<T>* tailNodePtr;

LinkedList() {
    Node<T>* headNodePtr = new Node<T>;  // <-- LOCALS
    Node<T>* tailNodePtr = new Node<T>;

Попробуйте вместо этого:

Node<T>* headNodePtr;  // <-- MEMBERS
Node<T>* tailNodePtr;

LinkedList() {
    headNodePtr = new Node<T>;  // <-- MEMBER ACCESS
    tailNodePtr = new Node<T>;
...