Einfach verkettete Liste mit Objekte rückwärts

L

lyon64

Hallo,

habe eine neue Aufgabe eingestellt, die fast fertig ist, allerdings nur fast ;)

Eine einfach verkettete Liste mit Objekte rückwärts ausgeben.

Vorgabe:
keine doppelt verkettete Liste erstellen
es soll die Methode ausgabeRueckwaerts () erstellen, die sich rekursiv aufruft
das Programm soll 5 Elemente vorwärts und dieselben Elemente rückwärts ausgeben

Mein code: ACHTUNG: Programm geht nicht ************!!

[ccp)

#include "stdafx.h"

using namespace System;

ref class listenelement {
String ^daten;
listenelement ^next;

public:
void datenSetzen(String ^datenneu);
void anhaengen(String ^datenneu);
void ausgeben();
void ausgebenRueckwaerts ();
};

//die Zeichenkette in das Element schreiben
void listenelement::datenSetzen(String ^datenneu)
{
daten=datenneu;
}
//neues Element am Ende der Liste anhängen
void listenelement::anhaengen(String ^datenneu)
{
//hat next den Wert nullptr?
//dann ein neues Element anhängen
if (next == nullptr) {
next = gcnew listenelement;
next->daten=datenneu;
//nullptr wird automatisch zugewiesen!
}
//sonst die Methode für next noch einmal aufrufen
else
next->anhaengen(datenneu);
//nur zur Veranschaulichung
Console::WriteLine("Daten {0} wurden eingefügt.",datenneu);
}

//Alle Elemente der Liste ausgeben
void listenelement::ausgeben()
{
//den ersten Eintrag ausgeben
Console::WriteLine("{0}",daten);
//wenn das Ende nicht erreicht ist, die Methode für next erneut aufrufen
if (next != nullptr)
next->ausgeben();
}
// *** NEU *** Alle Elemente rückwärts ausgeben ***rekursiv***
void listenelement::ausgebenRueckwaerts()
{
if(next != nullptr)
next->ausgebenRueckwaerts();
Console::WriteLine("{0}",next);
}

int main(array<System::String ^> ^args)
{
//Handle auf den Anfang der Liste
listenelement ^listenAnfang;

//Handle auf das Ende der Liste
listenelement ^listenEnde;

//das erste Element per Hand erzeugen
listenAnfang = gcnew listenelement;

//Zeichenkette in das erste Element schreiben
listenAnfang->datenSetzen("Element 1");

//in einer Schleife mehrere Elemente anfügen
for (Int32 schleife=2;schleife<6;schleife++)
listenAnfang->anhaengen("Element "+schleife);

//die Liste ausgeben
listenAnfang->ausgeben();

//die Liste rückwärts ausgeben
listenEnde->ausgebenRueckwaerts();

return 0;
}

[/ccp]

Wer kann mir hier einen Tipp geben.

Danke und Gruß
lyon64
 
Hallo badday,

konnte meine Aufgabe lösen. Anbei mein Ergebnis. :))


Gruß
lyon64

[ccp] #include "stdafx.h"

using namespace System;

ref class listenelement {
String ^daten;
listenelement ^next;

public:
void datenSetzen(String ^datenneu);
void anhaengen(String ^datenneu);
void ausgeben();
void ausgebenRueckwaerts ();
};

//die Zeichenkette in das Element schreiben
void listenelement::datenSetzen(String ^datenneu)
{
daten=datenneu;
}
//neues Element am Ende der Liste anhängen
void listenelement::anhaengen(String ^datenneu)
{
//hat next den Wert nullptr?
//dann ein neues Element anhängen
if (next == nullptr)
{
next = gcnew listenelement;
next->daten=datenneu;
//nullptr wird automatisch zugewiesen!
}
//sonst die Methode für next noch einmal aufrufen
else
next->anhaengen(datenneu);
//nur zur Veranschaulichung
Console::WriteLine("Daten {0} wurden eingefügt.",datenneu);
}

//Alle Elemente der Liste ausgeben
void listenelement::ausgeben()
{
//den ersten Eintrag ausgeben
Console::WriteLine("{0}",daten);
//wenn das Ende nicht erreicht ist, die Methode für next erneut aufrufen
if (next != nullptr)
next->ausgeben();
}
// *** NEU *** Alle Elemente rückwärts ausgeben ***rekursiv***
void listenelement::ausgebenRueckwaerts()
{
if(next != nullptr)
{
next->ausgebenRueckwaerts();
}
Console::WriteLine("{0}",daten);
}

int main(array<System::String ^> ^args)
{
//Handle auf den Anfang der Liste
listenelement ^listenAnfang;

//Handle auf das Ende der Liste
listenelement ^listenEnde;

//das erste Element per Hand erzeugen
listenAnfang = gcnew listenelement;

//Zeichenkette in das erste Element schreiben
listenAnfang->datenSetzen("Element 1");

//Listenanfang auf Listenende setzen
listenEnde = listenAnfang;

//in einer Schleife mehrere Elemente anfügen
for (Int32 schleife=2;schleife<6;schleife++)
listenEnde->anhaengen("Element "+schleife);

//die Liste ausgeben
listenAnfang->ausgeben();

//die Liste rückwärts ausgeben
listenAnfang->ausgebenRueckwaerts();

return 0;
} [/ccp]
 
C++:
#include "stdafx.h"

using namespace System;

ref class listenelement {
String ^daten;
listenelement ^next;

public:
void datenSetzen(String ^datenneu);
void anhaengen(String ^datenneu);
void ausgeben();
void ausgebenRueckwaerts ();
};

//die Zeichenkette in das Element schreiben
void listenelement::datenSetzen(String ^datenneu)
{
daten=datenneu;
}
//neues Element am Ende der Liste anhängen
void listenelement::anhaengen(String ^datenneu)
{
//hat next den Wert nullptr?
//dann ein neues Element anhängen
if (next == nullptr) {
next = gcnew listenelement;
next->daten=datenneu;
//nullptr wird automatisch zugewiesen!
}
//sonst die Methode für next noch einmal aufrufen
else
next->anhaengen(datenneu);
//nur zur Veranschaulichung
Console::WriteLine("Daten {0} wurden eingefügt.",datenneu);
}

//Alle Elemente der Liste ausgeben
void listenelement::ausgeben()
{
//den ersten Eintrag ausgeben
Console::WriteLine("{0}",daten);
//wenn das Ende nicht erreicht ist, die Methode für next erneut aufrufen
if (next != nullptr)
next->ausgeben();
}
// *** NEU *** Alle Elemente rückwärts ausgeben ***rekursiv***
void listenelement::ausgebenRueckwaerts()
{
if(next != nullptr)
next->ausgebenRueckwaerts();
Console::WriteLine("{0}",daten);
}

int main(array<System::String ^> ^args)
{
//Handle auf den Anfang der Liste
listenelement ^listenAnfang;

//Handle auf das Ende der Liste
listenelement ^listenEnde;

//das erste Element per Hand erzeugen
listenAnfang = gcnew listenelement;

//Zeichenkette in das erste Element schreiben
listenAnfang->datenSetzen("Element 1");
listenEnde=listenAnfang;
//in einer Schleife mehrere Elemente anfügen
for (Int32 schleife=2;schleife<6;schleife++)
listenAnfang->anhaengen("Element "+schleife);

//die Liste ausgeben
listenAnfang->ausgeben();

//die Liste rückwärts ausgeben
listenEnde->ausgebenRueckwaerts();

Console::Read();
return 0;
}

sooo ich hatte bzw habe diese aufgabe auch und dein Quelltext ist schon inordnung nur du darfst bei der ausgebe nicht Console::WriteLine("{0}",NEXT)schreiben sonder Daten dann klappt es habe mal den Quell text mit Kopiert.... im Übrigen bei der ersten Aufgabe hing ich auch 20 stunden an genau dem selben Problem und die Fragestllung ist bei mir die selbe gewesen XD
 
Danke, dass du doch noch eine Lösung bringst.
Durch die fehlende Reaktion vom Fragesteller hab ich den Thread gar nicht mehr angeschaut...

Was aber bei euch beiden der Fall ist:
Ihr verwendet C++/CLI, als eine .NET-Sprache.
Das ist kein C++, auch wenns im Namen vorkommt.
...Nur als Info.

Gruß
 
c++/C++/cli

Ehm auch wenn sich grade alle die das lesen denken Boa das weiß doch jeder......Aber ich frag Trotzdem mal....Wo is der Unterscheid zwischen C++ Und C++/CLI....****?
 
C++/CLI ist eine von Microsoft entwickelte Sprache, die ursprünglich dafür gedacht war,
die Klassen von C# mit C++-Syntax zu mischen.
Also die C#-Funktionalität mit C++-Schreibweise für den Code.
Das hatte MS eigentlich vor.
Den C#-Klassenteil haben sie geschafft, den Rest nicht.
Die Syntax/Schreibweise von C++/CLI ist jetzt weder die von C# noch C++,
sondern was eigenes neues.

...Wenn man die (nicht sehr beliebte) Schreibweise mal wegdenkt,
ist der Funktionsumfang von C++/CLI komplett gleich wie bei C#
und passt damit besser zu Java als C/C++.

C# wird übrigens allgemein als Programmierer-freundlicher angesehen...
Wenn man also bisher unwissend seine Winformsprogramme
in "C++" mit gcnew^ usw. geschrieben hat, tut man sich mit dem Umstieg
auf C# selbst einen Gefallen. Man wird sich sofort damit auskennen,
und das Programmieren geht etwas leichter.
Vor allem, wenn man zB. Java schon kennt.

Der einzige Grund, bei dem ich C++/CLI verwenden würde:
Wenn ich C++ und C# zusammen in ein Programm hängen will.
C++/CLI machts relativ einfach, den Verbindungsteil
zwischen den zwei Welten zu machen.

Lange Rede, kurzer Sinn: Bis auf den Namen haben die zwei Sprachen wenig gemeinsam.

Und mach dir keine Sorgen; weil du das nicht wusstest.
Bist bei Weitem nicht der Einzige.
Vor allem, weil das echte C++ und C++/CLI in Visual Studio beide als "C++" drin sind.

Vllt. will Microsoft ja so die Verwendung seiner Sprache erhöhen,
indem die Leute absichtlich verwirrt werden...

Von MS offiziell aus gibts den Namen "C++/CLI" meines Wissens gar nicht.
Fakt ist aber, dass es nicht C++ ist; deshalb hat sich irgendwie der Name mit CLI eingebürgert.

Gruß
 
Zurück