einfach verkettete Liste in doppelt verkettete Liste umwandeln
-
Hallo,
Ich versuche eine einfach verkettete Liste in eine doppelt verkettete Liste umzuwanden.
Ich habe dazu die extra Funktion ausgaberueckwaerts() hinzugefügt. Allerdings klappt das noch nicht so ganz. Kann sich jemand bitte mal die Funktion anschauen und mir sagen was ich falsch mache?
Als Zeiger für den vorherigen Eintrag in der Struktur habe ich "last" genommen.
#include <iostream.h> // Definition des Typs für die Elemente der Liste als Struktur struct listenelement { char daten[30]; listenelement* next; listenelement* last; }; // Zeiger auf den Anfang der Liste listenelement* listenanfang; // Zeiger aud das Ende der Liste listenelement* listenende; // Hilfszeiger, um in der Liste wandern zu können listenelement* hilfszeiger; // Funktion zum Einfügen von Elementen in die Liste void einfuegen(char datenneu[30]) { // Hilfszeiger an den Anfang der Liste setzen hilfszeiger = listenanfang; // Durch die Liste gehen, bis das letzte Element erreicht ist while (hilfszeiger->next != NULL) { hilfszeiger = hilfszeiger->next; } // Neues Element in die Liste einfuegen hilfszeiger->next = new(listenelement); // Hilfszeiger auf das neue Element setzen hilfszeiger = hilfszeiger->next; // Daten im neuen Element eintragen strcpy(hilfszeiger->daten,datenneu); hilfszeiger->next = NULL; } // Alle Elemente in der Liste ausgeben void ausgeben() { // Hilfszeiger auf den Anfang der Liste setzen hilfszeiger = listenanfang; // erstes Element ausgeben cout << hilfszeiger->daten << "\n"; // Solange das Ende der Liste noch nicht erreicht ist : while (hilfszeiger->next != NULL) { // hilfszeiger auf nächstes Element setzen hilfszeiger = hilfszeiger->next; // Daten ausgeben cout << hilfszeiger->daten << "\n"; } } // Alle Elemente rueckwaerts in der Liste ausgeben void ausgaberueckwaerts() { // Hilfszeiger auf Listenende setzen hilfszeiger = listenende; // letztes Element ausgeben cout << hilfszeiger->daten<< "\n"; // Solange der Anfang noch nicht erreicht ist while (hilfszeiger->last != ANFANG) { // hilfszeiger auf vorheriges Element setzen hilfszeiger=hilfszeiger->last; // Daten ausgeben cout << hilfszeiger->daten << "\n"; } } // Initialisieren der Liste void init() { //erstes Element erzeugen listenanfang = new(listenelement); // daten in das erste Element schreiben listenanfang->next = NULL; strcpy(listenanfang->daten,"Element 0"); } // Liste leeren und speicher freigeben void ende() { // Solange noch elemente in der Liste sind while (listenanfang != NULL) { // Hilfszeiger auf das erste Element der Liste hilfszeiger = listenanfang; // Zeiger für den Listenananfang auf das nächste Element setzen listenanfang = listenanfang->next; // Das herausgenommene Element löschen delete(hilfszeiger); } } void main() { init(); einfuegen("Element 1"); einfuegen("Element 2"); ausgeben(); ausgaberueckwaerts(); ende(); char p[50]; cin.getline(p,50); }
Freue mich über eure Anregungen und Tipps.
MFG
MR Blond
-
Beim einfuegen machst du gar nichts mit dem last zeiger. Du musst den last zeiger auf jeden fall aktualisieren
-
void einfuegen(char datenneu[30]) { // Hilfszeiger an den Anfang der Liste setzen hilfszeiger = listenanfang; // Durch die Liste gehen, bis das letzte Element erreicht ist while (hilfszeiger->next != NULL) { hilfszeiger = hilfszeiger->next; } // Neues Element in die Liste einfuegen hilfszeiger->next = new(listenelement); // Hilfszeiger auf das neue Element setz //dies zeile fehlt !!!! hilfszeiger->next->last = hilfszeiger; hilfszeiger = hilfszeiger->next; // Daten im neuen Element eintragen strcpy(hilfszeiger->daten,datenneu); hilfszeiger->next = NULL; }
mfg
-
spjoe schrieb:
void einfuegen(char datenneu[30]) { // Hilfszeiger an den Anfang der Liste setzen hilfszeiger = listenanfang; // Durch die Liste gehen, bis das letzte Element erreicht ist while (hilfszeiger->next != NULL) { hilfszeiger = hilfszeiger->next; } // Neues Element in die Liste einfuegen hilfszeiger->next = new(listenelement); // Hilfszeiger auf das neue Element setz //dies zeile fehlt !!!! hilfszeiger->next->last = hilfszeiger; hilfszeiger = hilfszeiger->next; // Daten im neuen Element eintragen strcpy(hilfszeiger->daten,datenneu); hilfszeiger->next = NULL; }
mfg
Das habe ich soweit verändert. Jetzt mäckert der Compiler das in meiner
Funktion ausgaberueckwaerts() das Symbol 'Anfang' nicht definiert ist.
-
void init() { //erstes Element erzeugen listenanfang = new(listenelement); // daten in das erste Element schreiben listenanfang->next = NULL; //neu zeile listenanfang->last = NULL; strcpy(listenanfang->daten,"Element 0"); }
und
void ausgaberueckwaerts() { // Hilfszeiger auf Listenende setzen hilfszeiger = listenende; // letztes Element ausgeben cout << hilfszeiger->daten<< "\n"; // Solange der Anfang noch nicht erreicht ist while (hilfszeiger->last != NULL) { // hilfszeiger auf vorheriges Element setzen hilfszeiger=hilfszeiger->last; // Daten ausgeben cout << hilfszeiger->daten << "\n"; } }
Bissel selber nachdenken wäre auch angebracht
Hab das gefühl du verstehst zeiger-zeigern noch nicht ganz
Also liest dir dass vieleicht nochmal durch
mfg
-
Ich habe jetzt alle Änderungen genau so vorgenommen wie du es vorgeschlagen hast. Dennoch bekomme ich eine Speicherschutzverletzung: Im Project ... .exe ist eine Exception der Klasse EAccessViolation aufgetreten. Meldung: 'Zugriffsverletzung bei Adresse 3264DF50. Lesen von Adresse '000000000'. Prozess wurde angehalten. Mit einzelne Anweisung oder Start fortsetzen.
Trotzdem Danke für deine Hilfe.
-
debugge dein programm.. ist sehr hilfreich
-
leo aka qsch schrieb:
debugge dein programm.. ist sehr hilfreich
Habe ich gerade mal gemacht und damit auch den Fehler gefunden. Jetzt läuft alles einwandfrei. Vielen dank nochmal an alle, die mir geholfen haben.