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. 🙂


Anmelden zum Antworten