CLI - Einfach verkettete Liste



  • Hallo ich bin neu in diesem Forum.

    Wie der Titel schon sagt habe ich ein Problem mit einfach verketteten Listen. Die Suchfunktion hat leider nichts gebracht, weshalb ich diesen Beitrag neu verfasse.

    Ich mache gerade einen Fernlehrgang zum IT-Manager bei ILS und hänge an einer Einsendeaufgabe fest.

    Die Sprache um die es geht ist C++/CLI.

    In der Aufgabe geht es um eine einfach verkettete Liste.

    Der Quelltext soll so abgeändert werden, dass nicht jedes mal beim Einlesen die ganze Liste von Anfang bis Ende durchgegen werden soll, sondern das Ende der Liste als Argument an die Funktion übergeben werden soll. Damit soll das Einfügen schneller von statten gehen, da das Ende der Liste ja bereits fest steht.

    // einfach verkettete Liste.cpp: Hauptprojektdatei.
    
    #include "stdafx.h"
    
    using namespace System;
    
    ref struct listenelement
    	{
    	String ^daten;
    	listenelement ^next;
    	};
    
    //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;
    
    	//Durch die Liste gehen, bis das letzte Element erreicht ist
    	while (hilfshandle->next != nullptr)
    		hilfshandle = hilfshandle->next;
    
    	//neues Element am Ende der Liste anhängen
    	hilfshandle->next = gcnew listenelement;
    
    	//Hilfshandle auf das neue Element setzen
    	hilfshandle=hilfshandle->next;
    
    	//Zeichenkette im neuen Element eintragen
    	hilfshandle->daten=datenneu;
    
    	//nullptr wir 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ächte 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 an den Anfang der Liste
    	listenelement ^listenanfang;
    
    	//das erste Element per Hand erzeugen
    	listenanfang= gcnew listenelement;
    
    	//Zeichenkette in das erste Element schrieben
    	//nullptr wird automatisch gesetzt!
    	listenanfang->daten="Element 1";
    
    	//in einer Schleife mehrere Elemente einfügen
    	for (Int32 schleife=2;schleife <21; schleife++)
    		anhaengen("Element "+schleife,listenanfang);
    
    	//die Liste ausgeben
    	ausgeben(listenanfang);
    
    	Console::Read();
        return 0;
    }
    

    Mir geht es hier nicht darum die Lösung als Quelltext zu bekommen, sondern eher darum das mir jemand das mit einfachen Worten erklären kann. Was bei welchem Schritt passiert, denn auch das ist aus den Heften nicht so leicht zu erkennen.

    Was ich weiß ist, dass ich einen weiteren Hilfshandle vereinbaren muss, der ständig auf das Ende gerichtet sein muss.

    Danke schon mal im Voraus.



  • Und jedes Jahr die gleichen Fragen zu dieser (bescheuerten) Aufgabe: Suche nach "listenelement" "C++/CLI".

    Schon wieder dieser Kurs bei dieser komischen Akademie. Ich hoffe, du weißt, daß C++ und C++/CLI zwei unterschiedliche Sprachen sind (obwohl der Kurs irgendwas mit C++ im Namen hat)!
    C++/CLI ist keine Sprache, mit der man Applikationen schreibt, sondern sollte nur für Inter-Op zwischen native und managed benutzt werden.

    Und inhaltlich kann ich dich nur auf den Wiki-Artikel Verkettete Liste verweisen (besonders die Code-Beispiele).



  • Danke erst einmal für die Antwort.

    Wenn ich im Forum danach gesucht habe (und ich hab sämtliche Wörter zum suchen benutzt) zeigt mir die Suchfunktion des Forums keine Treffer an.

    Ich wollte eigentlich nur mal das mir jemand in einem einfachen vernünftigem deutsch erklärt wie der Zusammenhang mit den einzelnen Schritten ist. Das Thema "Listen" bei Wiki & Co hab ich mir schon durchgelesen, doch als Anfänger sämtliches Fachchinesisch zu verstehen ist nicht gerade einfach. Das könnte man damit vergleichen, wie wenn ich meiner Frau erkläre wie sie ne Datei in eine eMail einfügt. Für mich ist das kein Thema, doch für meine Frau ist das nicht ohne.

    Aber zur Aufgabe:

    Wenn ich das auf ein Blatt Papier zeichne und mir denk wie das vor sich geht, komm ich da schon mit, doch an der Umsetzung habert es halt.

    Überall wird gesagt, dass CLI für Anfänger nicht geeignet wäre, doch sagt das nicht uns die es lernen müssen, sondern denen die sich die Lehrgänge ausdenken. Denn wenn es wenig Sinn hätte diese Sprache zu lernen, warum unterrichtet man dann diese?

    Gruß Toni



  • Vielen Dank nochmal für die guten Denkanstöße. Aufgabe ist geschafft.

    #include "stdafx.h"
    
    using namespace System;
    
    ref struct listenelement
    	{
    	String ^daten;
    	listenelement ^next;
    	};
    
    //neues Element am Ende der Liste anhängen
    
    listenelement ^anhaengen(String ^datenneu, listenelement ^listenende) {
    
    	//ein Hilfshandle
    	listenelement ^hilfshandle;
    	hilfshandle = listenende;
    
    	//Überprüfung ob das nächste Element 0 ist
    	if (hilfshandle->next == nullptr)
    		{
    		  // WENN ja, dann neues Element einfügen
    		  hilfshandle->next = gcnew listenelement;
    		  //Hilfshandle auf das nächste Element setzten
    		  hilfshandle=hilfshandle->next;
    		  //Daten eintragen
    		  hilfshandle->daten=datenneu;
    
    		}
    	else Console::WriteLine("Hilfshandle ist nicht gewandert");
    
    	//Zurückliefern der Adresse des Hilfshandles
    	return hilfshandle;
    
    	}
    
    //Alle Elemente der Liste ausgeben
    Void ausgeben(listenelement ^listenanfang){
    
    	 listenelement ^hilfshandle;
    	 hilfshandle = listenanfang;
    
    	 Console::WriteLine("{0}", hilfshandle->daten);
    
    	 while (hilfshandle->next != nullptr) {
    		  hilfshandle=hilfshandle->next;
    		  Console::WriteLine("{0}", hilfshandle->daten);
    
    		  }
    	 }
    
    int main(array<System::String ^> ^args)
    {
        //Handle an 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";
    
    	//listenende erhält den listenanfang
    	listenende = listenanfang;
    
    	//in einer Schleife mehrere Elemente ans Ende einfügen
    	for (Int32 schleife=2;schleife <21; schleife++){
    
    		 //Die Adresse von Hilfshandle bekommt das neue Element
    		 listenende=anhaengen("Element "+schleife,listenende);
    		 }
    
    	//die Liste ausgeben
    
    	ausgeben(listenanfang);
    
    	Console::Read();
        return 0;
    }
    

Log in to reply