Ich habe ein Lehrbuch gelesen und stieß auf die folgende Funktion, um ein Element aus einer verknüpften Liste zu entfernen. Der CELL
Typ ist wie folgt definiert;C Implementierung einer verknüpften Liste Element entfernen Funktion
typedef struct CELL CELL;
struct CELL {
int element;
CELL* next;
};
void delete(int x, CELL** pL) {
if ((*pL) != NULL) {
if (x == (*pL)->element)
(*pL) = (*pL)->next;
else
delete(x, &((*pL)->next));
}
}
Angenommen, ich habe eine verknüpfte Liste mit den folgenden Elementen beginnend bei 5;
5->10->3->21->15->7
Jetzt nehme ich löschen Element 10. Meine Frage ist, was mit dem CELL
geschieht 10 enthält, wenn die delete
Funktion kehrt nun, dass diese CELL
unreferenced ist? Nimmt es nicht noch Speicherplatz in Erinnerung?
Rufen Sie einen Debugger-Schritt durch den Code und untersuchen Sie die Variablen. – OldProgrammer
Ohne Bezug, diese Funktion ist beispielhaft für das Prinzip: "Nur weil du kannst, bedeutet nicht, dass du es solltest." Dieser Algorithmus * lässt sich leicht zu einer iterativen Lösung portieren. Wahrscheinlich als Teil einer rekursiven Lösung für Datenstrukturen Kurs/Lektion verwendet, kann es dort seinen Zweck erfüllen, aber vermeiden es in der Praxis. – WhozCraig
Ja, es beansprucht immer noch Platz, obwohl nicht klar ist, wie das Element zugewiesen wurde. Es kann besser sein, die "delete" -Funktion bei der Speicherverwaltung nicht zu beachten und einen Zeiger auf die gelöschte "CELL" zurückzugeben (oder "NULL", wenn keine Zelle gelöscht wurde) und den Anrufer freizulassen. Sie könnten eine Wrapper-Funktion haben, die das Element ebenfalls freigibt. Die andere seltsame Sache über diese Funktion ist die Verwendung von Tail-Rekursion anstelle von Iteration. Wenn der Compiler das nicht optimiert, könnten Sie einen Stapelüberlauf bekommen, wenn die Liste lang ist. –