Verkettete Listen, Zeiger und delete
-
Hallo zusammen!
ich habe zwei Fragen:
1. Ich erstelle eine einfach verkettete Liste um Punkdaten zu speichern wie folgt:
struct vertex { float x; float y; vertex* next; }; struct vertex* first_vertex = NULL; struct vertex* last_vertex = NULL; struct vertex* temp_vertex; void append_vertex (float x, float y) { temp_vertex = new vertex; temp_vertex->x = x; temp_vertex->y = y; temp_vertex->next = NULL; cout << "x : " << temp_vertex->x << " y: " << temp_vertex->y << endl; if (first_vertex == NULL) first_vertex = temp_vertex; else last_vertex->next = temp_vertex; last_vertex = temp_vertex; }
Leider hat mir die Suchfunktion im Bezug auf das Löschen der ganzen Liste
nicht geholfen. Kann mir jemand einen Ansatz nennen? Das Löschen von
"temp_vertex" kann wohl kaum ausreichend sein, was ist mit den andern Zeigern
in der Liste?2. ich lege Speicherplatz für ein zweidimensionales Array an:
float (*mesh)[2] = new float [numofverts][2];
wobei die Variable 'numofverts' bereits einen Wert hat. Wie muß dieser Speicherplatz jetzt freigegeben werden?
Hoffe Ihr könnt mir weiterhelfen
GreetZ
ReSeT
-
ReSeT schrieb:
Leider hat mir die Suchfunktion im Bezug auf das Löschen der ganzen Liste
nicht geholfen. Kann mir jemand einen Ansatz nennen?Schreibe doch einen Destruktor von vertex, der next löscht.
Warum nimmst du eigentlich nicht std::list<>?
-
// Löschen der Liste ist einfach: Eine Liste lösche ich, indem ich die Restliste lösche und dann den Kopfknoten. // Eine leere Liste hat keine Restliste, aber auch keinen Kopfknoten, muß daher nicht gelöscht werden. void delete_list(vertex* v) { if (v) { delete_list(v->next); delete v; } }
Als Übung kannste das ja in eine Iteration überführen
-
Als Übung kannste das ja in eine Iteration überführen.
lol, ich versuche seit einiger Zeit, Listen und Rekursion zu verstehen,
kann auch nicht nachvollziehen, was Dein Code macht und da sagst Du mir sowas.Wie kann überhaupt die Zeile "delete v" ausgeführt werden, wenn die Funktion sich
bis zum Listenende immer selbst aufruft und dann abbricht?GreetZ
ReSeT <--- bittet um Erklärung
-
ReSeT schrieb:
Wie kann überhaupt die Zeile "delete v" ausgeführt werden, wenn die Funktion sich
bis zum Listenende immer selbst aufruft und dann abbricht?Das ist gar nicht so schwer
void delete_list(vertex* v) { //hier wird gefragt ob v leer ist if (v) { //ist dem nicht so, ruft delete_list sich wieder selber auf delete_list(v->next); //wenn die Rekusion am ende der liste ist, also v->next leer ist, //dann wird das erste mal delete ausgeführt delete v; //die Funktion ist beendet und springt wieder in die vorher aufgerufene //zurück usw. } }
Hoffe das war verständlich
-
Da ich jetzt keine Lust habe, Rekursion zu erklären schieb ich einfach die iterative Version nach:
void delete_list(vertex *v) { while (v) { vertex *temp = v->next; delete v; v = temp; } }
(rekursiv wäre hier auch unangebracht)