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;
}
War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top