Triviale einzig verknüpfte Listenanfrage
-
13-10-2019 - |
Frage
Die Addtohead -Funktion der verknüpften Listenklasse funktioniert nicht ordnungsgemäß. Die Funktion scheint den Kopf zu ersetzen. Hilfe. Bitte.
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;
}
Lösung
Im addToHead()
, Sie zuweisen die Adresse einer lokalen Variablen zum head
Element Ihrer Liste. Nach der Rückkehr dieser Funktion wird die lokale Variable zerstört und darf nicht zugegriffen werden.
Eine Möglichkeit, dies zu beheben, besteht darin, eine dynamische Zuweisung zu verwenden, um ein neues zu machen 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;
}
}
Nachdem Sie den Speicher für diesen Knoten zugewiesen haben, ist Ihr LinkedList
Die Klasse sollte auch für die Befreiung des Knotens verantwortlich sein (mit delete
) irgendwann in der Zukunft.
Andere Tipps
LinkedNode a(e);
ist nur im Bereich von Addtohead. Der Zeiger darauf (&a
) wird ungültig, sobald die Funktion zurückgibt.