Problem: Doppelt Verkettete Liste



  • Ich hänge jetzt schon seit Wochen an diesem Problem.
    Ich habe versucht eine Einfach Verkettete Liste in eine Doppelt Verkettete Liste
    umzuschreiben.Das Programm sollte den Listeninhalt vorwärts und rückwärts ausgeben.
    Das geht aber irgendwie nicht. Ich vermute mal, dass das am Zeiger "last" liegen muss ich komme aber nicht darauf was fehlt oder falsch ist.
    /* ##################################
    Doppelt verkettete Liste
    ###################################*/

    #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;

    // 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 einfügen
    hilfszeiger->next = new(listenelement);
    hilfszeiger->last = new(listenelement);
    // Hilfszeiger auf das neue Element setzen

    // Daten im neuen Element eintragen
    strcpy(hilfszeiger->next->daten,datenneu);

    }

    // Alle Elemente 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";
    }
    }

    void ausgaberueckwaerts()
    {
    //Hilfsziger auf Listenanfang setzen
    hilfszeiger = listenanfang;
    //Durch die Liste gehen, bis das letzte Element
    //erreicht ist
    while(hilfszeiger->next != NULL)
    {
    hilfszeiger = hilfszeiger->next;
    }
    // Letztes Element ausgeben
    cout << hilfszeiger->daten << "\n";

    //vom Ende nach vorne gehen und Elemente ausgeben
    while (hilfszeiger->last != NULL) {
    //Daten ausgeben
    cout << hilfszeiger->daten<<endl;

    }
    //erstes Element ausgeben
    cout << hilfszeiger->daten<<endl;

    }

    // 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 Listenanfang 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);
    }



    1. Überarbeite bitte deinen Code mit Code-Tags. Sowas lesen sich hier die Wenigsten durch.
    2. WAS für ein Fehler tritt WANN auf?


  • Die Daten werden nicht rückwärts ausgegeben. Ich dachte eigentlich, dass
    das an dem Zeiger "last" liegt; finde selbst aber keinen Fehler.



  • Du solltest in der Schleife Deinen hilfszeiger auch updaten. Ansonsten das nächste mal bitte Code-Tags, es ist sehr schwer sich so in dem Code zurecht zu finden.



  • auf den ersten blick würd ich sagen ist der fehler hier:

    // Neues Element in die Liste einfügen
    hilfszeiger->next = new(listenelement);
    hilfszeiger->last = new(listenelement);//?? hier trennst du die kette nach hinten
    // Hilfszeiger auf das neue Element setzen
    

    du bist auf dem letzten element und hängst eins hinten ran!
    dann mußt du beim rangehangenen natürlich auf das bisher letzte zeigen. also:

    hilfzeiger->next->last = hilfszeiger;
    


  • Danke für die Infos haben mir echt geholfen.


Anmelden zum Antworten