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元素。此函数返回后,局部变量被销毁,不得访问。

解决此问题的一种方法是使用动态分配来创建一个新的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 回答