Einfach verkettet Liste



  • Hallo zusammen,

    bin neu hier im Forum und auch neu in der Welt der Programmiersprache.
    Lerne das Programmieren über ein Fernstudium.
    Dazu muss ich immer nach jeder Lektion sogenannte Einsendeaufgaben machen und hier ist auch schon das Problem.

    Aufgabenstellung:
    Ändern Sie die einfach verkettete Liste aus dem Studienheft so, dass das Ende der Liste nicht bei jedem Anhängen neu ermittelt werden muss, sondern in einem eigenen Zeiger gespeichert wird.
    Dieser Zeiger für das Listenende soll dann beim Anhängen neuer Elemente benutzt werden.
    Zwei kleine Hilfestellungen zur Lösung:
    • Sie müssen dafür sorgen, dass das Listenende nach jedem Anhängen ermittelt wird und auch an die Funktion main() zurückgeliefert wird. Dazu müssen Sie die Funktion zum Anhängen entsprechend verändern.
    • Als Argument beim Anhängen übergeben Sie dann nicht mehr den Listenanfang, sondern das Listenende.

    Folgender Code:

    /* ##############################################################
    Einfache verkettete Liste
    ############################################################## */
    #include <iostream>
    using namespace std;
    
    struct listenelement
    {
        string daten;
        listenelement *next;
    };
    
    void anhaengen(string datenneu, listenelement *listenanfang)
    {
        listenelement *hilfszeiger;
        hilfszeiger = listenanfang;
    
        while (hilfszeiger->next !=nullptr)
            hilfszeiger = hilfszeiger->next;
        hilfszeiger->next = new(listenelement);
        hilfszeiger= hilfszeiger->next;
        hilfszeiger->daten= datenneu;
        hilfszeiger->next=nullptr;
    }
    
    void ausgeben(listenelement *listenanfang)
    {
        listenelement *hilfszeiger;
    
        hilfszeiger = listenanfang;
    
        cout<<hilfszeiger->daten<<'\n';
    
        while (hilfszeiger->next !=nullptr)
        {
            hilfszeiger= hilfszeiger->next;
            cout<<hilfszeiger->daten<<'\n';
        }
    }
    
    void ende(listenelement *listenanfang)
    {
        listenelement *hilfszeiger;
    
        while(listenanfang != nullptr)
        {
            hilfszeiger= listenanfang;
            listenanfang = listenanfang->next;
            delete(hilfszeiger);
        }
    }
    
    int main()
    {
        listenelement *listenanfang = new(listenelement);
        listenanfang->next=nullptr;
        listenanfang->daten="Element 1";
    
        anhaengen("Element 2", listenanfang);
        anhaengen("Element 3", listenanfang);
        anhaengen("Element 4", listenanfang);
    
        ausgeben(listenanfang);
        ende(listenanfang);
    
        return 0;
    }
    

    Freu mich schon auf euere Anworte, hänge das schon seit 2 Wochen fest 😞
    Danke!!!!

    Gruß
    Philipp



  • "Es kommt zu einer Fehlermeldung" - aha. Warum zeigst du nicht die Meldung? Warum sehen wir nicht den Code, der zu der Meldung führt?

    Wenn man einen Wert zurückgeben möchte, darf die Funktion nicht void sein. Das sollte vorher mal erklärt worden sein.

    Benutze Codetags, dann kann man es hier auch ordentlich lesen.

    Wo machst du dieses Fernstudium? Das ist leider der Stil "wir lernen erstmal schlechtes C und dann erst (schlechtes?) C++".



  • Es wäre besser, du würdest deinen aktuellen Code zeigen.

    Noch besser wäre es, du würdest ihn auch zwischen Code-Tags packen, dann bleibt die Formatierung erhalten. (Code mit der MAus markieren und auf de C++ Button unter den 😞 :p klicken)
    Als Mitglied kannst du deinen Beitrag sogar noch editieren.

    Weißt du, was Rückgabewerte von Funktionen sind?
    Eine Funktion, die die Liste löscht, "ende" zu nennen ist auch eher unglücklich.



  • Hier mal mein Versuch 😕 😕 😕
    Die Beiden Ausgaben in der Funktion "anhaengen" sind nur für mich, hab gedacht vielleicht find ich so den Fehler wo es hängt.

    /* ##############################################################
    Einsendeaufgabe
    ############################################################## */
    #include <iostream>
    using namespace std;
    
    struct listenelement
    {
        string daten;
        listenelement* next;
    };
    
    listenelement* anhaengen (string datenneu,  listenelement* listenende)
    {
        if(listenende->next==nullptr)
        {
            listenende->next=new(listenelement);
            listenende=listenende->next;
            listenende->daten=datenneu;
            listenende->next=nullptr;
            cout<<listenende->daten<<'\n';
        }
        else
            cout<<"Fehler\n";
        return listenende;
    }
    
    void ausgeben(listenelement *listenanfang)
    {
        listenelement *hilfszeiger;
    
        hilfszeiger = listenanfang;
    
        cout<<hilfszeiger->daten<<'\n';
    
        while (hilfszeiger->next !=nullptr)
        {
            hilfszeiger= hilfszeiger->next;
            cout<<hilfszeiger->daten<<'\n';
        }
    }
    
    void loeschen (listenelement* listenanfang)
    {
        listenelement* hilfszeiger;
        while (listenanfang!=nullptr)
        {
            hilfszeiger=listenanfang;
            listenanfang=listenanfang->next;
            delete(hilfszeiger);
        }
    }
    
    int main()
    {
        listenelement* listenanfang;
        listenelement* listenende;
        listenanfang=new(listenelement);
        listenanfang->next=nullptr;
        listenanfang->daten="Element 1";
        listenende=listenanfang;
    
        anhaengen("Element 2", listenende);
        anhaengen("Element 3", listenende);
        anhaengen("Element 4", listenende);
    
        ausgeben(listenanfang);
        loeschen(listenanfang);
    
        return 0;
    }
    


  • Überleg' mal was du bisher mit dem Return-Wert der Funktion 'anhaengen' machst.


Anmelden zum Antworten