琐碎的单链表查询

时间:2010-12-25 21:03:49

标签: c++ linked-list singly-linked-list

链表类的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 个答案:

答案 0 :(得分: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)。

答案 1 :(得分:2)

LinkedNode a(e);仅在addToHead的范围内。一旦函数返回,指向它的指针(&a)就会失效。