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.