Void Funktion mit ^String um return erweitern
-
Hallo zusammen,
ih bin seit ca. 2 Monaten dabei C++/CLI zu lernen und stehe derzeit vor einer Wand um die ich nicht vorbeikomme
Hoffentlich könnt ihr mir weiterhelfen.Es geht um folgendes....ich habe eine Void Funktion die zwei ^String Werte übergeben bekommt. Ursprünglih habe ich mit tracking reference gearbeitet, so dass ich listenende auf hilfsHandle->next referenzieren konnte um das Ende einer einfach verketteten Liste zu markieren.
Allerdings wurde mir nun gesagt, dass es auch einfacher gegangen wäre indem ich listenende über return zurückgegeben hätte....nur ich komm schlicht und einfach nicht drauf wie ich das machen soll. Totaler Blackout gerade Um einen Fingerzeig oder ähnlicheem wäre ich dankbar.
Hier der Code:
Void anhaengen (String ^datenneu, listenelement ^%listenende) { //ein Hilfshandle zum Wandern in der Liste listenelement ^hilfsHandle; //Hilfshandle an das Ende der Liste setzen hilfsHandle = listenende; //ein neues Element anlegen hilfsHandle->next = gcnew listenelement; //Zeichenkette im neuen Element eintragen hilfsHandle->daten=datenneu; //hilfsHandle->next wird auf listenendde referenziert, wodurch ->next als letztes Element gekennzeichnet wird //und beim erneueten durchgehen der Funktion als erstes aufgerufen wird //Liste wird somit nicht mehr komplett durchgegangen um den letzten Wert zu finden listenende=hilfsHandle->next; //nullptr wird automatisch zugewiesen }
-
Meinst du sowas ?
listenelement^ anhaengen(String^ datenneu, listenelement^ listenende) { if (listenende != nullptr) { listenende->next = gcnew listenelement; listenende->daten = datenneu; return listenende->next; } return nullptr; }
-
Hi,
das ist schon ein guter Ansatz....was ich aber dazu hätte sagen sollen ist, dass die Werte mit einer for schleife an die Funktion übergeben werden. Sprich, eine Liste soll aufgefüllt werden und der neue Datensatz immer am Ende der Liste angehängt werden.
Bei der o.g. Funktion gibt mir das Programm immer nur das letzte Element aus.....zum einfacheren Verstehen werde ich mal das gesamt Listen anhängen:
Im Prinzip möchte ich die Funktion "anhaengen" so verändern, dass sie ihre generelle funktionalität behält aber das ganze mit "return" ausgibt....ich komm nur nicht drauf wie
#include "stdafx.h" using namespace System; ref struct listenelement { String ^daten; listenelement ^next; listenelement ^last; }; //neues Element am Ende der Liste anhängen //mit Hilfe der tracking reference kann man den Wert des Handles listenende an einen anderen Handle übergeben //somit ist das Ende der Liste immer bekannt Void anhaengen (String ^datenneu, listenelement ^%listenende) { //ein Hilfshandle zum Wandern in der Liste listenelement ^hilfsHandle; //Hilfshandle an das Ende der Liste setzen hilfsHandle = listenende; //ein neues Element anlegen hilfsHandle->next = gcnew listenelement; //Zeichenkette im neuen Element eintragen hilfsHandle->daten=datenneu; //hilfsHandle->next wird auf listenendde referenziert, wodurch ->next als letztes Element gekennzeichnet wird //und beim erneueten durchgehen der Funktion als erstes aufgerufen wird //Liste wird somit nicht mehr komplett durchgegangen um den letzten Wert zu finden listenende=hilfsHandle->next; //nullptr wird automatisch zugewiesen } //Alle Elemente in der Liste ausgeben Void ausgeben (listenelement ^listenanfang) { //ein Hilfshandle zum Wandern in der Liste listenelement ^hilfsHandle; //hilfsHandle auf den Anfang der Liste setzen hilfsHandle=listenanfang; //erstes Element ausgeben Console::WriteLine("{0}", hilfsHandle->daten); //Solange das Ende der Liste 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); } } int main(array<System::String ^> ^args) { //Handle auf den Anfang und das Ende der Liste setzen listenelement ^listenanfang; listenelement ^listenende; //Das erste Element per Hand erzeugen und listenende den Wert von listenanfang zuweisen listenanfang = gcnew listenelement; listenende = listenanfang; //Zeichenkette in das erste Element setzen; nullptr wird automatisch gesetzt //dies kann nicht mehr funktionieren, da listenanfang nicht mehr übergeben wird listenanfang->daten="Element 1"; //in einer Schleife mehrere Elemente einfügen for (Int32 schleife = 1; schleife < 50; schleife++) anhaengen("Element "+schleife, listenende); //Liste ausgeben ausgeben(listenanfang); Console::Read(); return 0; }
-
Wo ist das Problem ?
Das hier gibt bei mir
1
2
3
4
5
aus:#include "stdafx.h" using namespace System; ref struct ListElem { String^ Data; ListElem^ Next; }; ListElem^ Create(String^ data) { ListElem^ ret = gcnew ListElem; ret->Data = data; return ret; } int main(array<System::String ^> ^args) { ListElem^ start = nullptr; ListElem^ current = start; for(int i = 1; i <= 5; i++) { if ( current == nullptr ) { start = current = Create(i.ToString()); } else { current->Next = Create(i.ToString()); current = current->Next; } current->Next = nullptr; } current = start; while( current != nullptr ) { Console::WriteLine(current->Data); current = current->Next; } return 0; }
-
Oder umgeschrieben mit einer Einfügefunktion:
using namespace System; ref struct ListElem { String^ Data; ListElem^ Next; }; ListElem^ Create(String^ data) { ListElem^ ret = gcnew ListElem; ret->Data = data; return ret; } ListElem^ Append(ListElem^ list, String^ data) { if ( list == nullptr ) { list = Create(data); } else { list->Next = Create(data); list = list->Next; } list->Next = nullptr; return list; } int main(array<System::String ^> ^args) { ListElem^ start = nullptr; ListElem^ current = start; for(int i = 1; i <= 5; i++) { current = Append(current, i.ToString()); if ( start == nullptr ) { start = current; } } current = start; while( current != nullptr ) { Console::WriteLine(current->Data); current = current->Next; } return 0; }