0

リンク リスト クラスの 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;
}
4

2 に答える 2

3

では、ローカル変数のアドレスをリストの要素にaddToHead()割り当てています。この関数が戻った後、ローカル変数は破棄され、アクセスしてはなりません。head

これを修正する 1 つの方法は、動的割り当てを使用して新しい を作成すること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

于 2010-12-25T21:07:55.543 に答える
2

LinkedNode a(e);addToHead のスコープ内のみです。それへのポインター ( &a) は、関数が戻るとすぐに無効になります。

于 2010-12-25T21:07:21.780 に答える