Doppelt verkettete Liste



  • Hi! Ich brauch hilfe, sitze schon eine woche dran und komm nicht weiter,
    also es war, oder es ist eine einfach verkettete liste ich muß aus dieser eine doppelte draus machen. vieleicht ein rat.
    Arbeite mit C++Builder 6 von Borland.

    danke!

    #include <iostream.h>
    
    struct listenelement {
            char daten[30];
            listenelement* next;
            listenelement* last;
    };
    
    listenelement* listenanfang;
    listenelement* listenende;
    
    listenelement* hilfszeiger;
    
    void einfuegen(char datenneu[30]) {
             hilfszeiger = listenanfang;
    
            while (hilfszeiger->next != NULL) {
            hilfszeiger = hilfszeiger->next;
             }
    
            hilfszeiger->next = new(listenelement);
            hilfszeiger = hilfszeiger->next;
    
            strcpy(hilfszeiger->daten,datenneu);
            hilfszeiger->next = NULL;
    
    }
    
    //Keine Änderungen
    void ausgeben() {
    
            hilfszeiger = listenanfang;
            cout << hilfszeiger->daten << "\n";
    
            while (hilfszeiger->next != NULL) {
    
             hilfszeiger = hilfszeiger->next;
             cout << hilfszeiger->daten << "\n";
             }
    }
    void ausgaberueckwaerts() {
    
           listenende = hilfszeiger;
            cout <<hilfszeiger->daten<<"\n";
    
            while (hilfszeiger->next != NULL) {
    
             hilfszeiger = hilfszeiger->last;
             cout << hilfszeiger->daten << "\n";
             }
    
    }
    
    void init() {
    
            listenanfang = new(listenelement);
            listenanfang->next = NULL;
            listenanfang->last = NULL;
            strcpy(listenanfang->daten,"Element 0");
    
    }
    
    void ende(){
            while (listenanfang != NULL) {
              hilfszeiger = listenanfang;
              listenanfang = listenanfang->next;
    
              delete(hilfszeiger);
              }
    }
    
     //Nur Funktionsaufruf
    void main(){
    
            init();
            einfuegen("Element 1");
            einfuegen("Element 2");
            ausgeben();
            ausgaberueckwaerts();
            ende();
    
            char p[50];
            cin.getline(p,50);
    }
    


  • Warum nicht die STL benutzen und da so einen schönen "Datentyp"?



  • was meinst du mit STL, ich muß das so machen, ist hausaufgabe.



  • Wo genau ist dein Problem?
    Ohne den Code näher angeschaut zu haben ist mir gleich am Anfang etwas aufgefallen, was auf einen Denkfehler hinweisen könnte. Ein Listenelement enthält im klassischen Fall jeweils einen Zeiger aufs nächste Element, und einen Zeiger aufs vorhergehenede Element (nicht auf das erste / letzte).
    Das ist ganz nützlich, damit man vorwärts und rückwärts durch die Liste fetzen kann.

    Wenn du damit fertig bist, dann les' dir schon mal das Kapitel über Bäume an. Mit Vorsprung lernt sich's leichter und deine Noten werden besser.



  • So, jetzt habe ich es wider besseres Wissen doch getan und mir den Code angeschaut.
    ausgaberueckwaerts() kann so gar nicht funktionieren. Fang' am besten dort an. Versetz' dich mal in die Lage der CPU und spiel' einen Fall mal durch. Was steht in "listenende" und "hilfszeiger" drin? Klingelt's?

    Dann überlege dir, wie es klappen könnte.
    Und während du dabei bist, überlegst du dir was du an anderen Stellen ändern musst, damit es klappt (z.B. bei einfuegen()).

    Eigentlich ist es gar nicht so schlimm - du hast schon Brauchbares geleistet. ende() ist zum Beispiel schön kurz und knackig (und richtig).



  • Hi! hab jetzt die ausgaberueckwaerts()so geändert,

    void ausgaberueckwaerts() {
    
            listenende = hilfszeiger;
             cout<< listenende->daten <<"\n";
    
            while (listenende->last != NULL) {
              listenende = hilfszeiger->next;
             cout << listenende->daten << "\n";
    
             }
    
    }
    

    ich denk das es richtig ist weil das auf den letzten element zugreift.
    aber mit dem einfuegen() hab ich probleme komm nicht weiter hab schon alles versucht.



  • Ist es nicht ein Verstoß gegen die Bestimmungen wenn Du deine Hausaufgaben hier erledigen lässt ? 😉



  • Wieso, kann ich nicht nach einen rat fragen? seit wann ist es verboten?



  • sanja schrieb:

    Arbeite mit C++Builder 6 von Borland.

    Du arbeitest dabei auch mit Windows, warum stellst du die Frage nicht in einem Windows-Forum!? 😉

    Im Ernst: hier geht es um C++Builder-spezifische Probleme. Deine Aufgabe ist so allgemein, dass sie sich mit jedem beliebigen C/C++-Compiler umsetzen lässt. Und deshalb geht der Thread jetzt auf die Reise.



  • Dieser Thread wurde von Moderator/in Jansen aus dem Forum VCL/CLX (Borland C++ Builder) in das Forum Rund um die Programmierung verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Hier hab ich mal was zu dem Thema skizziert: http://www.c-plusplus.net/forum/viewtopic-var-t-is-129765-and-highlight-is-.html

    MfG

    GPC


Log in to reply