Einfach verkettete Liste mit Objekte

L

lyon64

Hallo,

ich mache im Moment einen Kurs Visual C++/CLI und bin an einer Aufgabe, bei dieser ich ein paar Tipps benötigen könnte. Da ich diesen Kurs rein privat mache und beruflich nie umsetze, tue ich auch niemanden weh, wenn ich es über dieses Forum versuche ;)

Es soll am nachfolgenden Code das Listenende beim Einfügen nicht immer neu ermittelt, sondern neue Elemente direkt am Ende eingefügt werden.

Vorgaben:
Keine Änderung der Klasse
300 Elemente am Listenende einfügen



#include "stdafx.h"

using namespace System;

ref class listenelement {
String ^daten;
listenelement ^next;
public:
Void datenSetzen(String ^datenneu);
Void anhaengen(String ^datenneu);
Void ausgeben();
};

//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();
}

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=1;schleife<301;schleife++)
listenanfang->anhaengen("Element "+schleife);

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

return 0;
}


Gruß
lyon64
 
Es soll am nachfolgenden Code das Listenende beim Einfügen nicht immer neu ermittelt, sondern neue Elemente direkt am Ende eingefügt werden.

Du musst einfach nur deine Schleife in der main ändern:
C++:
// Das Handle listenende brauchst du nicht mehr
listenelement ^aktuellesElement = listenanfang;

//in einer Schleife mehrere Elemente anfügen
for (Int32 schleife=1;schleife<301;schleife++) 
{
  listenanfang->anhaengen("Element "+schleife);
  aktuellesElement = next;
}
(Ich kenne mich in C# nicht aus, nur in C++, Syntax-Fehler könnten drin sein)
Und poste bitte nächstes Mal dein Code in den C++-Tags: [code=cpp][/code].
 
Hallo ComFreek,

danke, für Deine schnelle Antwort. Ich lerne seit März Visual C++/CLI und kenne nicht alle Begriffe.
Was meinst Du mit Und poste bitte nächstes Mal dein Code in den C++-Tags: [code=cpp][/code].
Wie geht das bzw. was soll ich genau tun?

Gruß
lyon64
 
Hallo badday,

danke, für Deine Antwort. Ich habe mich heute registrieren lasse, also erster Tag für mich.
Sorry, dass ich mich so blöd anstelle, aber ich kann noch nicht nachvollziehen, wie Du das
mit dem blauen Balken (Code cpp:) gemacht hast. Muss mich noch damit befassen, bevor
ich Fragen stelle.

Gruß
lyon64
 
Wenn du das Zwischen die beiden Tags (Tags sind [xxx] zum öffnen und [/xxx] zum schließen) schreibst, wird das alles automatisch gemacht, ich habe also mit dem blauen Balken nichts zu tun ;)

Gruß,

badday
 
Hier sind die meisten BB-Codes (aber nicht die Code-Tags) aufgelistet: Hilfe->BB-Code Liste

@badday: Es gibt das [plain ][ /plain]-Tag, um BB-Codes unformatiert darzustellen.

@lyon64: Ist das Problem jetzt gelöst? Oder hast du noch Fragen?
 
Hallo ComFreek,

ich glaube, so ist es richtig. Leider haben die Änderungen im Programm nicht das gewünschte Ergebnis gebracht.

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();
};

//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();
}

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

//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<4;schleife++)
listenanfang->anhaengen("Element "+schleife);

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

return 0;
}
[/ccp]
 
Jetzt hast du dich beim schließenden Tag verschrieben, das ist echt Pech :D

Zu deinem Code:
Du hast doch gar nicht meinen Teil übernommen.
Versuche mal folgendes:
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();
};

//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) {
next = gcnew listenelement;
next->datenSetzen(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();
}

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

//das erste Element per Hand erzeugen
listenanfang = gcnew listenelement;
//Zeichenkette in das erste Element schreiben
listenanfang->datenSetzen("Element 1");
aktuellesElement = listenAnfang;

//in einer Schleife mehrere Elemente anfügen
for (Int32 schleife=1;schleife<301;schleife++) 
{
  listenanfang->anhaengen("Element "+schleife);
  aktuellesElement = next;
}
//die Liste ausgeben
listenanfang->ausgeben();

return 0;
}
 
Hallo ComFreek,

danke, für Deine Hilfe. Ich habe noch listenAnfang in listenanfang geändert und
bei "error C2065: 'next': nichtdeklarierter Bezeichner" werde ich versuchen alleine
klar zu kommen.

Gruß
lyon64
 
Zurück