Einfach verkettete Liste



  • Hallo Leute.Ich will aus einer einfach verketteten Liste eine doppelt verkettete Liste machen.
    Kann mir da jemand helfen?
    Hier ist die einfach verkettete Liste:

    P.S Die funktion ausgeben() darf nicht verändert werden.

    #include <iostream.h>

    // Definition des Typs für die Elemente der Liste als Struktur
    struct listenelement {
    char daten[30];
    listenelement* next;
    };

    // 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 auf das neue Element setzen
    hilfszeiger = hilfszeiger->next;
    // Daten im neuen Element eintragen
    strcpy(hilfszeiger->daten,datenneu);
    hilfszeiger->next = NULL;
    }

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

    // 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();
    ende();

    char p[50];
    cin.getline(p,50);
    }



  • Naja, also prinzipiell musst du einfach in dein Listenelement einen Eintrag *previous mit dazunehmen. Ausgeben klappt dann noch genauso. Du musst nur bei Listenoperationen immer drauf achten, dass du nicht nur den next-Zeiger sondern auch den previous-Zeiger anpasst. Das hört sich einfach an, ist aber teilweise ziemlich nervig - vorallem wenn du Elemente einfügst musst du insgesamt 4 Zeiger setzen und brauchst evtl. einen Hilfszeiger als Zwischenspeicher.

    Wars das was du meintest oder suchst du ne Implementation?



  • Servus ihr beiden,
    ich stehe vor einem ähnlichen Problem aus ner einfach verketteten Liste eine doppelt verkettete Liste zu erstellen. Kann jemand dazu mal ein paar Quellcodezeilen posten, wäre echt hilfreich.
    Ich sage schon mal ganz artig dankeschön und wünsche euch noch ne schöne Woche.

    P.S. Ist schon komisch das es im Forum nicht direkt was dazu gibt zu dem Thema, in jeder Schule mit Programmieren wird dieser Bereich durchgenommen.



  • [/quote]
    Ist schon komisch das es im Forum nicht direkt was dazu gibt zu dem Thema, in jeder Schule mit Programmieren wird dieser Bereich durchgenommen.
    [quote]

    So seltsam ist das gar nicht, wenn man nicht gerade versucht zu verstehen wie das geht, benutzt man einfach Zeugs aus der STL.
    Und da in einem Forum wie hier, wo wohl fast ausschließlich Hobbyisten vorbei kommen, suche die meisten auch einfach nur Lösungen für praxisnahe Probleme, für die, die STL dann auch besser ist.

    @doppelt verkettete Liste:

    Was die doppelt verkettete Liste angeht, einfach mal in Google eingeben.

    http://hal.iwr.uni-heidelberg.de/lehre/inf1-ws02/html/node126.html
    War das erste Ergebnis.
    Gefällt res seuch nicht, einfach den nächsten Link anklicken.


Anmelden zum Antworten