doppelt verkettete liste



  • Hallo ich habe ein kleines problem. Ich krig das mit dem einfügen des last zeigers
    nicht hin.
    Kann mir vieleicht jemand helfen?
    Ich solte nur die einfuegen funktion ferändern.

    #include <iostream.h>
    
    struct listenelement{
            char daten[30];
            listenelement* next;
            listenelement* last;
    };
    
    listenelement* listenanfang,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;
    }
    
    void ausgeben() {
    
            hilfszeiger = listenanfang;
    
            cout<<hilfszeiger->daten<<"\n";
    
            while (hilfszeiger->next !=NULL) {
                    hilfszeiger = hilfszeiger->next;
    
                    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);
            }
    }
    
    void main(){
            init();
            einfuegen("Element 1");
            einfuegen("Element 2");
            ausgeben();
            ende();
    
            char p[50];
            cin.getline(p,50);
    }
    

    Bitte Code-Tags verwenden!



  • Um ehrlich zu sein, habe ich keine Lust, ne Seite Code ohne cpp Tags zu lesen. Aber ich hab erst kürzlich mal was ausführliches dazu geschrieben: http://www.c-plusplus.net/forum/viewtopic-var-t-is-129765-and-highlight-is-.html



  • Sorry ich bin glaube zu blöd dafür das sagt mir nicht viel.



  • #include <iostream.h>
    
    struct listenelement{
        char daten[30];
        listenelement* next;
        listenelement* last;
    };
    
    listenelement* listenanfang,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;
    }
    
    void ausgeben() {
    
        hilfszeiger = listenanfang;
    
        cout<<hilfszeiger->daten<<"\n";
    
        while (hilfszeiger->next !=NULL) {
            hilfszeiger = hilfszeiger->next;
    
            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);
    }
    }
    
    void main(){
        init();
        einfuegen("Element 1");
        einfuegen("Element 2");
        ausgeben();
        ende();
    
        char p[50];
        cin.getline(p,50);
    }
    

    Sowas meint er. Im übrigen ist das kein C++ sondern verunreinigtes C. iostream.h gehört nicht zum C++ Standard und selbst wenn dem so wäre, macht ein C++ Programm mehr aus, als die Verwendung von new/delete und iostreams.



  • .filmor schrieb:

    Sowas meint er. Im übrigen ist das kein C++ sondern verunreinigtes C. iostream.h gehört nicht C++ Standard und selbst wenn dem so wäre, macht ein C++ Programm mehr aus, als die Verwendung von new/delete und iostreams.

    Ist aber eventuell OK wenn er gerade C++ lernt und noch nichts von OOP weiß.

    Gruß



  • nalus schrieb:

    Hallo ich habe ein kleines problem. Ich krig das mit dem einfügen des last zeigers
    nicht hin.
    Kann mir vieleicht jemand helfen?
    Ich solte nur die einfuegen funktion ferändern.

    Wo muss man den Last Zeiger einfügen? Ich versteh nicht ganz was du meinst.

    mfg.



  • nalus schrieb:

    Hallo ich habe ein kleines problem. Ich krig das mit dem einfügen des last zeigers
    nicht hin.
    Kann mir vieleicht jemand helfen?
    Ich solte nur die einfuegen funktion ferändern.

    #include <iostream.h>
    
    struct listenelement{
            char daten[30];
            listenelement* next;
            listenelement* last;
    };
    

    Besser #include <iostream> - ohne '.h'.
    Verwende std::string statt char[] - das ist einfacher - und verpasse listenelement einen Konstruktor, der alle Member initialisiert, das schafft später Übersicht (s.u.)

    #include <string>
    
    struct listenelement{
        listenelement( const std::string& datenneu, listenelement* next_ = 0, listenelement* last_ = 0 )
            : daten( datenneu )
            , next( next_ )
            , last( last_ )
        {}
        std::string daten;  // statt char daten[30];
        listenelement* next;
        listenelement* last;
    };
    

    nalus schrieb:

    listenelement* listenanfang,listenende;

    listenelement* hilfszeiger;

    globale Variablen gilt es zu vermeiden. 'hilfszeiger' ist definitiv überflüssig als globale Variable. Wenn schon global dann in jedem Fall initialisieren

    listenelement* listenanfang = 0;
    listenelement* listenende = 0;
    

    nalus schrieb:

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

    Das ist eher ein 'Anhängen' als ein 'Einfügen'. Mit dem Konstruktor und std::string vereinfacht sich jetzt einiges und der last-Zeiger wird auch richtig belegt.

    void anhaengen( const std::string& datenneu )
    {
        listenelement* hilfszeiger = new listenelement( datenneu, 0, listenende );
        if( listenende )    // Liste hat mindestens ein Element
        {
            listenende->next = hilfszeiger;
        }
        else
        {   // falls kein Ende, so kein Anfang, also aktualisieren
            listenanfang = hilfszeiger;
        }
        listenende = hilfszeiger;
    }
    

    nalus schrieb:

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

    das geht einfacher und es ist sinnvoll den ostream mitzugeben, auf den man ausgibt; es könnte ja auch ein File sein 😉

    void ausgeben( std::ostream& out ) 
    {
        for( listenelement* hilfszeiger = listenanfang; hilfszeiger != 0; hilfszeiger = hilfszeiger->next )
            out<< hilfszeiger->daten << std::endl;
    }
    

    nalus schrieb:

    void init(){
            listenanfang = new(listenelement);
    
            listenanfang->next = NULL;
            listenanfang->last = NULL;
            strcpy(listenanfang->daten,"Element 0");
    }
    

    'init' ist unnötig; einfach weglassen

    nalus schrieb:

    void ende(){
            while (listenanfang !=NULL){
                    hilfszeiger = listenanfang;
    
                    listenanfang = listenanfang->next;
    
                    delete(hilfszeiger);
            }
    }
    
    void main(){
            init();
            einfuegen("Element 1");
            einfuegen("Element 2");
            ausgeben();
            ende();
    
            char p[50];
            cin.getline(p,50);
    }
    

    In 'ende' - ein besserer Name wäre vielleicht 'loeschen' - bitte die Zeiger listenanfang und listenende wieder auf 0 setzen. Sonst kracht's beim nächsten Anhängen.

    Für die main()-Funktion bleibt jetzt nur noch

    void main(){
        using namespace std;
        anhaengen("Element 1");
        anhaengen("Element 2");
        ausgeben( cout );
        ende();
    
        char p[50];
        cin.getline(p,50);
    }
    

    Wenn Du jetzt noch die globalen Zeiger in eine Klasse packst und aus jeder Funktion eine Methode dieser Klasse machst und den Code in 'ende' in den Destruktor tust, dann ja dann sähe's schon richtig gut aus; und auch .filmor wäre wohl gnädiger gestimmt.

    Gruß
    Werner



  • Fast, bis darauf, dass void main weder gültiges C++ noch C (nach C99) ist!
    Außerdem müssen die Daten noch mit private gekennzeichnet werden. Ansonsten 👍 😃



  • Ich danke Dir Werner Salomon für die kommplete beschreibung. Das problem ist ich darf den origenal queltext nicht verändern ausser der funktion einfügen. Ich mus anstat dem befel " hilfszeiger = hilfszeiger->next; " so einen in der art benutzen " hilfszeiger->next->daten = ..... " das sagt mir aber nichts.
    Ich habe meine bücher durch gekukt da steht auch nur so wie du es hast.



  • Bäh seid ihr wiederliche Bastarde manchmcal :roll:

    Hallo, .filmor !!!

    Warum ist DAS kein c++ programm?
    Warum kann ein c++ Proggramm denn mehr als das?

    du bist ja einer - immer alles schlecht reden.!!! HALLO!!!!
    ER LERNT!!!! :xmas1: :xmas2:



  • Nalus schrieb:

    Das problem ist ich darf den origenal queltext nicht verändern ausser der funktion einfügen.

    mal so aus Neugierde: warum nicht? In welchem Kontext (Schule, Kurs, Studium, zum Spaß) lernst Du C++? wird Dir beigebracht, dass der Code, den Du uns gezeigt hast, korrekt wäre - mal abgesehen von der fehlenden initialisierung von 'last'?

    Nalus schrieb:

    Ich mus anstat dem befel " hilfszeiger = hilfszeiger->next; " so einen in der art benutzen " hilfszeiger->next->daten = ..... " das sagt mir aber nichts.

    Ok - ändere Deinen Code 'einfuegen' nach:

    void einfuegen(char datenneu[30]){
            hilfszeiger = listenanfang;
    
            while(hilfszeiger->next != NULL) {
                    hilfszeiger = hilfszeiger->next;
            }
    
            hilfszeiger->next = new(listenelement);
    
            // neues Objekt initialisieren
            strcpy(hilfszeiger->next->daten,datenneu);
            hilfszeiger->next->next = NULL;
            hilfszeiger->next->last = hilfszeiger;
    
            // Listenende neu setzen
            listenende = hilfszeiger->next;
    }
    

    Nach der while-Schleife zeigt der 'hilfszeiger' auf das bisher letzte Element. Mit

    hilfszeiger->next = new(listenelement);
    

    wird an eben dieses Element ein neues angehängt. Deren Inhalt ist aber nicht initialisiert. Der Zeiger auf dieses neue Element (oder Objekt) steht immer in 'hilfszeiger->next' was auch ein Pointer ist.
    Also kannst Du auf jedes Member des neuen Objekt mit 'hilfszeiger->next->Member' zugreifen z.B.: 'hilfszeiger->next->last' (s.o.).
    Mach Dir mal 'ne Zeichnung von den Objekten und ihren Zeigern und male Pfeile an jeden Zeiger auf welches Objekt er zeigt - dann wird's klarer.

    Gruß
    Werner



  • Danke Werner das hat mir super geholfen.
    👍 🙂


Anmelden zum Antworten