Pointer als Rückgabewert einer Funktion



  • Hallöchen,

    ich habe mir eine einfach verkettete Liste geschrieben, in der die nächsten Listenelemente immer am Ende angehängt werden. Dazu hab ich in einer Funktion eine Schleife verwendet, die die komplette Liste durchgeht, bis das Ende erreicht wurde.

    Nun wollte ich den Code umschreiben, so, dass nach jedem Anhängen ein Pointer auf das letzte Element gerichtet ist, damit das Programm nicht immer erst alle Elemente durchgehen muss.

    struct listenelement
    {
        string daten;
        listenelement* next;
    };
    
    listenelement* anhaengen(string datenneu, listenelement* listenende)
    {
        listenelement* hilfszeiger;
    
        hilfszeiger = listenende;
    
        hilfszeiger->next  = new(listenelement);
    
        hilfszeiger = hilfszeiger->next;
    
        hilfszeiger->daten = datenneu;
        hilfszeiger->next  = nullptr;
    
        listenende = hilfszeiger;
    
        return (listenende);
    }
    
    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);
    
        return 0;
    }
    

    Ich hab mir gedacht, dass es klappen müsste, wenn ich einen eigenen Pointer auf das letzte Element setze und die Struktur, auf die der Pointer zeigt über return zurückgeben lasse. Allerdings klappt es nicht und wenn ich die Werte ausgeben lasse, gibt er nur "Element 1" und "Element 4" aus. Woran das liegt weiß ich auch, zumindest vermute ich das. Weil er den Zeiger "listenende" per return nicht zurückgibt und somit keine Liste erstellt wird und es nur zwei abrufbare Werte gibt.

    Daher meine Frage: Kann man Pointer überhaupt als Rückgabewert benutzen? Oder was ist mein Fehler?

    Liebe Grüße



  • Man kann. Wenn man den Wert aber nicht benutzt, so wie du, stellt sich die Frage, wozu?



  • Ja man kann Pointer als Rückgabewert nutzen, allerdings ignorierst du deinen Rückgabewert. Dadurch ändert sich deine listenende Variable in der main Funktion nie. Das Einfügen müsste wenn dann so aussehen:

    listenende = anhaengen("Element 2", listenende);
    listenende = anhaengen("Element 3", listenende);
    listenende = anhaengen("Element 4", listenende);
    

    Dazu noch eine Frage: Wieso kopierst du in der anhaengen Funktion die Zeiger ständig um? Ich musste mir die Funktion 5min angucken um alles nachzuvollziehen. So wäre es viel lesbarer:

    listenelement* anhaengen(string datenneu, listenelement* listenende)
    {
        listenelement* neues_ende = new listenelement;
        neues_ende->daten = datenneu;
        neues_ende->next = nullptr;
    
        listenende->next = neues_ende;
        return neues_ende;
    }
    


  • Aber ich benutz ihn doch oder besser gesagt, ich will ihn benutzen. 😃

    Gedacht hab ich mir ja, dass ich am Anfang der Funktion anhaengen den Wert von listenende in hilfszeiger übergebe, dann in hilfszeiger die Werte einlesen lasse und zum Schluss die Werte wieder an listenende übergebe und dann per return zurück zur main Funktion übergebe. Wo dann gleich wieder die Funktion anhaengen aufgerufen wird, mit den Parametern des strings und listenende. Also, dass er dann beim Ende anfängt und gleich das nächste Element anhängen kann.

    Wieso besitzt listenende denn dann keinen Wert?



  • @sebi

    Oh man, vielen Dank!

    Du hast Recht, so sieht die Funktion echt lesbarer aus. Ich bin leider noch ein totaler Anfänger. Aber vielen Dank für die Hilfe, es funktioniert! 🙂


Log in to reply