Ich habe eine Aufgabe, bei der wir eine Klasse mit doppelt verknüpften Listen implementieren müssen. Aus irgendeinem Grund definierten sie den Knoten struct
wie folgt:
struct node {
node *next;
node *prev;
T *o;
};
Es scheint mir, dass es viel einfacher wäre, die Klasse zu schreiben, wenn das Strukturmitglied "data" kein Zeiger wäre. Unnötig zu sagen, dass ich es nicht ändern kann, also werde ich es einfach umgehen müssen. Ich habe versucht, die Methode, die ein Element an den Anfang der Liste hinzufügt, wie folgt zu implementieren:
template <typename T>
void Dlist<T>::insertFront(T *o) {
node *np = new node;
T val = *o;
np->o = &val;
np->prev = NULL;
np->next = first;
if (!isEmpty()) {
first->prev = np;
} else {
last = np;
}
first = np;
}
Während ich ddd zum Debuggen benutzte, stellte ich fest, dass alles beim ersten Mal, wenn man eine Zahl einfügt, gut funktioniert, aber beim zweiten Mal wird alles durcheinander gebracht, denn sobald man 'val' auf das neue Element setzt, wird das erste Element "überschrieben", da die Speicheradresse von val verwendet wurde. Ich habe versucht, andere Dinge zu tun, wie z.B. anstatt nur die Variable 'val' zu haben, folgendes zu tun:
T *valp = new T;
T val;
valp = &val;
val = *o;
np->o = valp
Auch das schien nicht zu funktionieren. Ich denke, das ist, weil es ziemlich viel nur eine kompliziertere Form von dem, was ich oben nur mit einem zusätzlichen Speicherleck :)
Jede Idee/jeder Hinweis in die richtige Richtung wäre großartig.