C++/CLI einfach verkettete Liste

Nyoko

Grünschnabel
Huhu,

Seit Tagen hänge ich nun an dieser Aufgabe,
aber ich bekomme dort keinen Durchblick.
Google hilft mir nicht weiter, da ich noch keine Klassen
beherrsche, und auch diverse Buecher helfen
mir nicht weiter.
Wo koennte ich anfangen?

Ich bitte um Hilfe...

/*
Aufgabe:
- verkettete Liste so ändern, dass das Listenende
nicht bei jedem Einfuegen neu ermittelt wird
sondern in einem eigenem Handle gespeichert wird.
*/

Btw:Bitte keine Lösung, nur Ansaetze, da dies eine Einsende
aufgabe ist.

Danke:)


Code:
/* #################################################
Eine einfach verkettete Liste
################################################# */

#include "stdafx.h"

using namespace System;

ref struct listenelement {
	String ^daten;
	listenelement ^next;
};

//neues Element am Ende der Liste einfuegen
void einfuegen(String ^datenneu, listenelement ^%listenAnfang) {
	
	listenelement ^hilfsHandle; //ein Hilfshandle zum Wandern in der Liste
	hilfsHandle = listenende; //Hilfshandle an den Anfang der Liste setzen

	while (hilfsHandle->next != nullptr) //Durch die Liste gehen, bis das letzte Element erreicht ist
		hilfsHandle = hilfsHandle->next;

	hilfsHandle->next = gcnew listenelement; //Neues Element am Ende der Liste einf?en
	hilfsHandle = hilfsHandle->next; //Hilfshandle auf das neue Element setzen
	
	hilfsHandle->daten=datenneu; //Zeichenkette im neuen Element eintragen

	
	//nullptr wird automatisch zugewiesen!
}

//Alle Elemente der Liste ausgeben
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?hste Element setzen und die Daten ausgeben
	while (hilfsHandle->next != nullptr) {
		hilfsHandle = hilfsHandle->next;
		Console::WriteLine("{0}",hilfsHandle->daten) ;
	}
}

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
	//nullptr wird automatisch gesetzt
	listenanfang->daten="Element 0";

	//in einer Schleife mehrere Elemente einf?en
	for (Int32 schleife=1;schleife<3;schleife++) 
		einfuegen("Element "+schleife,listenanfang);

	//die Liste ausgeben
	ausgeben(listenanfang);

	return 0;
}
 
Erstell für die eigentliche Liste halt eine eigene Klasse, in der du zwei Zeiger auf das erste und auf das letzte Element der Liste hast.
 
So ich habe es nun soweit das ich eine ausgabe ohne Fehler bekomme.

Danke fuer die Antwort aber Klassen sind mir noch (in dem sinne) unbekannt.
Ich soll noch keine Klassen nutzen.

Die Ausgabe erfolgt nun so:

Element 0
Element 2

Es fehlt element 1....hat jemand einen tip?
Danke abermals.


Code:
#include "stdafx.h"

using namespace System;

ref struct listenelement {
	String ^daten;
	listenelement ^next;
};

//neues Element am Ende der Liste einf?en
listenelement ^einfuegen(String ^datenneu, listenelement ^listenanfang) {

	listenelement ^hilfsHandle;
	hilfsHandle = listenanfang;

	hilfsHandle->next = gcnew listenelement;

	hilfsHandle = hilfsHandle->next;
	hilfsHandle->daten=datenneu;

	return hilfsHandle;

}

//Alle Elemente der Liste ausgeben
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?hste Element setzen und die Daten ausgeben
	while (hilfsHandle->next != nullptr) {
		hilfsHandle = hilfsHandle->next;
		Console::WriteLine("{0}",hilfsHandle->daten) ;
	}
}

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 0";

	//in einer Schleife mehrere Elemente einf?en
	for (Int32 schleife=1;schleife<3;schleife++) 
		listenende=einfuegen("Element "+schleife,listenanfang);

	//die Liste ausgeben
	ausgeben(listenanfang);

	return 0;
}
 
hallo zusammen ! ich habe selbst mal versucht die Aufgabe zu lösen. die Ansätze waren ja, bei der einfach verketteten Liste diese so neu zu gestalten, dass ein listenende erstellt wird in einem eigenen handle. Das Listenende soll nach jedem Einfüügen ermittelt und an die Main Funktion zurückgegeben werden. Als Argument soll man beim Einfügen nicht den listenanfang sondern listenende übergeben.
Könnt ihr mal schauen, ob meins syntaktisch korrekt ist ? :

#include "stdafx.h"

using namespace System;

ref struct listenelement {
String ^daten;
listenelement ^next;
};

listenelement ^einfuegen (String ^neu, listenelement ^listenende) {
listenelement ^hilfshandle;
hilfshandle=listenende;

while (hilfshandle->next != nullptr)
hilfshandle=hilfshandle->next;

hilfshandle->next = gcnew listenelement;
hilfshandle = hilfshandle->next;

hilfshandle->daten=neu;
return hilfshandle;
}
void ausgeben(listenelement ^listenanfang) {
listenelement ^hilfshandle;
hilfshandle = listenanfang;

Console::WriteLine("erstes Element: {0}",hilfshandle->daten);

while (hilfshandle->next != nullptr) {
hilfshandle = hilfshandle->next;

Console::WriteLine("nächstes Element: {0}",hilfshandle->daten);
}
}

int main(array<System::String ^> ^args)
{
listenelement ^listenanfang;
listenanfang = gcnew listenelement;

listenanfang->daten="Element 0";

listenelement ^listenende;
listenende = listenanfang;
while (listenende->next != nullptr)
listenende = listenende->next;

listenende->next = gcnew listenelement;
listenende = listenende->next;



for (Int32 schleife=1;schleife<3;schleife++)
einfuegen("Element "+schleife,listenende);

ausgeben(listenanfang);



return 0;
}

DANKE
 
Zurück