链表类的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;
}
答案 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
)就会失效。