lempy Geschrieben 21. März 2012 Teilen Geschrieben 21. März 2012 Hallo Leute Nach der einfachen verketteten Liste nun die doppelt verkettete Liste mit der Ausgabe Rückwärts. Die Ausgabe Rückwärts klappt aber ich glaube, ich habe die doppelt verkettete Liste nicht verstanden. Sieht in den bildlichen Darstellung ganz logisch aus, aber mit dem ins Programm umsetzen tue ich mich recht schwer. Währe nett, wenn einer von Euch mal in paar verständliche Anmerkungen dazu machen könnte, wie bei der einfach verketteten Liste. Hier mein Code: // Test zu 5_2.cpp: Hauptprojektdatei. #include "stdafx.h" using namespace System; ref struct listenelement { String ^daten; listenelement ^next; listenelement ^ende; }; // neues Element am Ende der Liste anhängen Void anhaengen (String ^datenneu, listenelement ^listenanfang) { // ein Hilfshandle zum Wandern in der Liste listenelement ^hilfsHandle; // HilfsHandle an den Anfang der Liste setzen hilfsHandle = listenanfang; // Hilfshandle zum Speichern des Vorgängers listenelement ^listenende; // Durch die Liste gehen, bis das letzte Element erreicht ist while (hilfsHandle -> next != nullptr) { hilfsHandle = hilfsHandle -> next; } // Aktuelle Adresse im Listenende speichern listenende = hilfsHandle; // Neues Element am Ende der Liste anhängen hilfsHandle -> next = gcnew listenelement; // Hilfshandle auf das neue Element setzen hilfsHandle = hilfsHandle -> next; // Vorgänger in letzte Adresse speichern hilfsHandle -> ende = listenende; // Zeichenkette im neuen Element eintragen hilfsHandle -> daten = datenneu; // nullptr wird automatisch zugewiesen! } // Alle Elemente der Liste ausgeben Void ausgaberueckwaerts ( listenelement^ listenende) { Console::WriteLine("{0}",listenende->daten) ; while (listenende->ende != nullptr) { listenende = listenende->ende; Console::WriteLine("{0}",listenende->daten) ; } //Eine leere Zeile ausgeben Console::WriteLine(); } Void ausgeben (listenelement ^listenanfang) { // ein Hilfshandle zum Wandern in der Liste listenelement ^hilfsHandle; hilfsHandle = listenanfang; // erstes Element ausgeben Console::WriteLine("{0}", hilfsHandle -> daten); // Solange das Ende der Liste noch nicht erreicht ist: // hilfshandle auf das nächste Element setzen und die Daten ausgeben while (hilfsHandle -> next != nullptr) { hilfsHandle = hilfsHandle -> next; Console::WriteLine("{0}", hilfsHandle -> daten); } Console::WriteLine("\n\n\n"); ausgaberueckwaerts (hilfsHandle); } int main(array<System::String ^> ^args) { // Handle auf den Anfang der Liste listenelement ^listenanfang; //listenelement ^listenende; // das erste Element per Hand erzeugen listenanfang = gcnew listenelement; // Zeichenkette in das erste Element schreiben // nullptr wird automatisch gesetzt listenanfang -> daten = "Element 1"; // in einer Schleife mehrere Elemente einfügen for (Int32 schleife = 2; schleife < 5; schleife++) anhaengen("Element " + schleife, listenanfang); // die Liste ausgeben ausgeben(listenanfang); //ausgaberueckwaerts(listenende); Console::Read(); return 0; } Lieben Dank Lempy Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Rekon1602 Geschrieben 22. März 2012 Teilen Geschrieben 22. März 2012 Hallo du musst dein struct noch ergänzen: ref struct listenelement { String ^daten; listenelement ^next; listenelement ^ende; [B] listenelement ^prev; listenelement ^start;[/B]}; Dadurch kennt jedes element sowohl seinen vorgänger, als auch seinen nachfolger. Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
lempy Geschrieben 22. März 2012 Autor Teilen Geschrieben 22. März 2012 Hallo Rekon1602 Danke erst ein mal. ^start und ^prev muss ich sicherlich noch in das Programm mit einbauen? Nur wie und wo? Verwirrt mich ein wenig, denn aus der Aufgabenstellung geht das für mich nicht hervor und die doppelt verkettete Liste wurde auch nicht näher behandelt. Ich gebe die Angaben dazu. "Erweitern Sie die einfach verkettete Liste so, dass sie zu einer doppelt verketteten Liste wird. Ergänzen Sie das Programm außerdem um eine Funktion, die die Liste rückwärts ausgibt. 1. Hilfestellung: Sie benötigen einen neuen Handle in der Struktur, der die Adresse des Vorgängers aufnehmen kann. Das soll bei listen ^ende sein 2. Hilfestellung: Die wichtigste Änderung müssen Sie beim Anhängen des neuen Elements vornahmen. Hier müssen Sie die Adresse des Vorgängers in Sicherheit bringen " Das soll bei mir listenelement ^listenende sein. z. B. listenende = hilfsHandle und dann hilfsHandle -> next -> ende bei mir. Vielleicht kannst Dur mir mit einer Erklärung, warum doch nicht nur ^ende, sondern auch noch ^start und ^prev Licht in die Dunkelheit bringen. Mit lieben Dank lempy Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Klotzkopp Geschrieben 23. März 2012 Teilen Geschrieben 23. März 2012 Vielleicht kannst Dur mir mit einer Erklärung, warum doch nicht nur ^ende, sondern auch noch ^start und ^prev Licht in die Dunkelheit bringen.Du brauchst keine weiteren Handles. Die Benennung des Handles des Vorgängers mit "ende" ist nur sehr ungewöhnlich und verwirrend. Bei diesem Namen würde man erwarten, dass das Handle eben auf das Listenende verweist, nicht auf das jeweilige Vorgängerelement. Der "übliche" Name dafür wäre prev (als Gegenstück zu next). Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
lempy Geschrieben 24. März 2012 Autor Teilen Geschrieben 24. März 2012 Aha!! Jetzt noch mal die Frage. Es kann so beleiben wie es jetzt ist? Antwort währe nett, da ich das ganze dann doch verstanden habe Lieben Gruß und besten Dank lempy Zitieren Link zu diesem Kommentar Auf anderen Seiten teilen Mehr Optionen zum Teilen...
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.