Тривиальный односвязный запрос списка - PullRequest
0 голосов
/ 26 декабря 2010

Функция addToHead класса связанного списка не работает должным образом.Функция, кажется, заменяет голову.Помогите.Пожалуйста.

template <class T>
class LinkedNode {
  public:
    LinkedNode(T);
    T element;
    LinkedNode<T> *next;
};

template <class T>
LinkedNode<T>::LinkedNode(T e){
    element = e;
    next = 0;
}
///////////////////////////////////////////
template <class E>
class LinkedList {
  public:
    LinkedList();
    void addToHead(E);
    LinkedNode<E> *head, *tail, *temp;
};

template <class E>
LinkedList<E>::LinkedList() {
    head = tail = NULL;
}

template <class E>
void LinkedList<E>::addToHead(E e) {
    LinkedNode<E> a(e);
    if (head == NULL)
        head = tail = &a;
    else {
        a.next = head;
        head = &a;
    }
}

int main(){
    LinkedList<int> list;
    list.addToHead(55);
    list.addToHead(22);
    cout << list.head->element << " trivial "<< list.head->next->element << endl;
}

Ответы [ 2 ]

3 голосов
/ 26 декабря 2010

В addToHead() вы присваиваете адрес локальной переменной элементу head вашего списка.После возврата из этой функции локальная переменная уничтожается и к ней нельзя обращаться.

Один из способов исправить это - использовать динамическое выделение для создания нового LinkedNode<E>:

template <class E>
void LinkedList<E>::addToHead(E e) {
    LinkedNode<E> *a = new LinkedNode<E>(e);
    if (head == NULL)
        head = tail = a;
    else {
        a->next = head;
        head = a;
    }
}

Послевыделяя память для этого узла, ваш класс LinkedList должен также отвечать за освобождение узла (с delete) в какой-то момент в будущем.

2 голосов
/ 26 декабря 2010

LinkedNode a(e); входит только в объем addToHead.Указатель на него (&a) становится недействительным, как только функция возвращается.

...