Einfach verkettete Listen Rückwärts ausgeben



  • Hallo zusammen,

    habe ein Problem mit meiner verketteten Liste. Diese führt nun sowohl vorwärts als auch rückwärts die Ausgabe der Elemente durch. Jedoch bekomm ich das nicht hin das sie nicht immer von vorne anfangen soll sondern das Ende speichern soll.
    Habe mal ein wenig was versucht jedoch ohne Erfolg.

    Vielleicht kann mir jemand einen Tipp geben oder mir meine Fehler aufzeigen

    /*##############################################################
    Verkettete lite Version 2
    ###############################################################*/
    
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using ConsoleApplication1;
    
    namespace ConsoleApplication1
    {
        //die Klasse für die Listenelemente mit Methoden
        class Listenelement
        {
            string daten;
            Listenelement naechster;
    
            //die Methode zum Setzen der Daten
            public void SetDaten(string datenNeu)
            {
                //die Zeichenkette setzen
                daten = datenNeu;
                //das Ende markieren
                naechster = null;
            }
    
            //die Methode zum Anhängen eines neuen Elements
            //sie ruft sich rekursiv auf, bis das Ende erreicht ist
            public void Anhaengen(string datenNeu)
            {
                //wenn das Element erreicht ist, ein neues Element erzeugen
                if (naechster == null)
                {
                    naechster = new Listenelement();
                    naechster.SetDaten(datenNeu);
    
                }
                //sonst ruft sich die Methode selbst wieder auf
                else
                    naechster.Anhaengen(datenNeu);
                //zur Veranschaulichung der Rekursion
                Console.WriteLine("Daten {0} wurden eingefügt.", datenNeu);
            }
    
            //die Methode zur Ausgabe der Liste, sie ruft sich ebenfalls rekursiv auf, bis das Ende erreicht ist
            public void Ausgeben()
            {
                Console.WriteLine("{0}", daten);
                if (naechster != null)
                    naechster.Ausgeben();
            }
    
            //die Methode zur rückwärts Ausgabe, sie ruft sich ebenfalls rekursiv auf, bis das Ende erreicht ist
            public void RueckAusgabe()
            {
                if (naechster != null)
                    naechster.RueckAusgabe();
                Console.WriteLine(daten);
            }
        }
        class Program
        {
            static void Main(string[] args)
            {
                //ein neues Listenelement erzeugen
                Listenelement listenAnfang = new Listenelement();
                Listenelement listenEnde = new Listenelement();
    
                //die Daten im ersten Listenelement setzen
                listenAnfang.SetDaten("Element 0");
    
                //weitere Elemente in einer Schleife anfügen
                for (int element = 1; element < 20; element++)
                {
                    listenAnfang.Anhaengen("Element " + element);
                    listenEnde = listenAnfang;
                }
    
                //die Liste ausgeben
                Console.WriteLine("Die Liste vorwärts ausgeben:\n");
                listenAnfang.Ausgeben();
                Console.WriteLine();
                Console.WriteLine("Die Liste rückwärts ausgeben:\n");
                listenEnde.RueckAusgabe();
                Console.WriteLine();
            }
        }
    }
    

    Gruß und danke



  • Scriptlaie schrieb:

    Jedoch bekomm ich das nicht hin das sie nicht immer von vorne anfangen soll sondern das Ende speichern soll.

    Mir ist der Sinn deines Satzes nicht ersichtlich. Ich kann nur raten was du meinst. Grundsätzlich nehme ich aber an das du hier eine Schulaufgabe zu erledigen hast, da du die Liste händisch programmierst, und keine vorgegebene nimmst.

    Ein paar Anmerkungen habe ich:
    1. Hältst du es für sinnvoll wenn die Listenelemente die gesamte Logik der Liste besitzen (Normalerweise würde ich eher eine Klasse Liste mit der Listenlogik erwarten, die wiederum intern dann die Listenelemente hält)?

    2. Du weist dem Listenende einen Wert zu den du niemals verwendest (sowohl bei der Initialisierung als auch anschließend.

    //...
    namespace ConsoleApplication1
    {
        //...
        class Program
        {
            static void Main(string[] args)
            {
                //ein neues Listenelement erzeugen
                Listenelement listenAnfang = new Listenelement();
                Listenelement listenEnde = new Listenelement(); // <-- niemals verwendet.
    
                //...
                for (int element = 1; element < 20; element++)
                {
                    listenAnfang.Anhaengen("Element " + element);
                    listenEnde = listenAnfang; // <-- Du tust nichts mit dem Listenende, so kann dir das merken natürlich auch nichts bringen.
                    // Zudem willst du hier sicherlich das eingefügte Element
                    // haben...
                }
                //...
            }
        }
    }
    

    Ich glaube eher das du ausschließlich an das Ende anhängen willst, dazu muss das Listenende aber sinnvoll initialisiert (Listenanfang) werden, und auch in deiner Schleife verwendet werden.

    Jetzt gibt es in deiner Schleife (die dann auch nur mit dem Listenende arbeiten sollte) 2 Varianten: Entweder gibt liefert dir dein "Anhaengen" das neue Element zurück und du weist dies dem Listenende zu ("listenEnde = listenEnde.Anhaengen...") oder du fragst die Eigenschaft "naechster" für die Zuweisung ab.

    Dies sollte dir vielleicht schon die Richtung weisen...



  • Hallo zusammen,

    bin mal wieder bei dem Thema verkette Liste. Ich habe mal einen Versuch gestartete meine Liste auch rückwärts auszugeben. Leider habe ich irgendwo einen Fehler drin und weiß nicht wo.
    Das Ende habe ich inzwischen gefunden und füge nun immer direkt am Ende der Liste ein.
    Wie hier soll auch die Rückwärtsausgabe rekursiv erfolgen.

    Vielleicht könnt ihr mal meinen bisherigen Code durchschauen und mir einen Hinweis geben, warum keinen Ausgabe bei der Methode der Rückwärtsausgabe erfolgt.

    Ich danke euch jetzt schon.

    /*######################################
    Verkette Liste
    ######################################*/
    
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace Cshp05a10
    {
        //die Klasse für die Listenelemente
        //jetzt auch mit Methoden
        class Listenelement
        {
            string daten;
            Listenelement naechster;
    
            //die Methode zum Setzen der Daten
            public void SetDaten(string datenNeu)
            {
                //die Zeichenkette setzen
                daten = datenNeu;
                //das Ende markieren
                naechster = null;
            }
    
            //die Methode zum Anhängen eines neuen Elements
            //sie ruft sich rekursiv auf, bis das Ende erreicht ist
            public Listenelement Anhaengen(string datenNeu)
            {
                //wenn das Ende erreicht ist, ein neues Element erzeugen
                if (naechster == null)
                {
                    naechster = new Listenelement();
                    naechster.SetDaten(datenNeu);
                }
                //sonst ruft sich die Methode selbst wieder auf
                else
                    naechster.Anhaengen(datenNeu);
                //zur Veranschaulichung der Rekursion
                //Console.WriteLine("Daten {0} wurden eingefügt.", datenNeu);
                return naechster;
            }
    
            //die Methode zur Ausgabe der Liste in Vorwärtsrichtung
            //sie ruft sich ebenfalls rekursiv auf, bis das 
            //Ende erreicht ist
            public void Ausgeben()
            {
                Console.WriteLine(daten);
                if (naechster != null)
                    naechster.Ausgeben();
            }
    
            //die Methode zur Ausgabe der Liste in Rückwärtsrichtung
            //sie ruft sich ebenfalls rekursiv auf, bis das 
            //Ende erreicht ist
            public void RueckAusgeben()
            {
                if( naechster != null)
                    naechster.RueckAusgeben();
                Console.WriteLine(daten);
            }
        }
    
        class Program
        {
            static void Main(string[] args)
            {
                //ein neues Listenelement erzeugen
                Listenelement listenAnfang = new Listenelement();
                Listenelement listenEnde = new Listenelement();
    
                //die Daten im ersten Listenelement setzen
                listenAnfang.SetDaten("Element 1");
    
                //weitere Elemente in einer Schleife anfügen
                Listenelement letztesElement = listenAnfang;
                for (int element = 2; element < 10; element++)
                    letztesElement = letztesElement.Anhaengen("Element " + element);
    
                //die Liste vorwärts ausgeben
                listenAnfang.Ausgeben();
                //die Liste rückwärts ausgeben
                listenEnde.RueckAusgeben();
                Console.ReadKey();
            }
        }
    }
    


  • Um es so zu sagen wie ich es verstehe:

    Du willst mit einer einfach verketteten Liste eine Operation ausführen für die man doppelt verkettete Listen braucht.

    Oder in Umgangssprache: Du willst im Vorwärtsgang rückwärts fahren.

    Beschreibt das ungefähr Dein Problem?



  • Hallo Scriptlaie,

    du gibt ja auch eine leere Liste aus (listenEnde wird bei dir ja nirgendwo gefüllt)...

    Nimm einfach

    listenAnfang.RueckAusgeben();
    


  • Hey super vielen dank. Das habe ich doch glatt übersehen, dass ich die falsche bzw. leere Liste ausgeben wollte.

    Klappt prima.


Anmelden zum Antworten