verkettete Liste



  • Hallo Leute

    Ich hoffe ihr habt alle eine schöne Weihnacht verbracht.

    Dieses Thema wurde laut Suchfunktion 2008 das letzte mal hier behandelt und darum greife ich es noch mal neu auf.

    Ich habe die Tage genutzt und mich mit verketteten Listen beschäftigt und möchte jetzt eine von 2 Aufgaben lösen. Komme aber irgendwie nicht weiter.

    Laut der Aufgabe soll ich eine einfach verkettete Liste so umwandeln, dass das Ende nach dem Anhängen nicht ständig neu ermittelt werden muss, sonder in einen dafür vorgesehenen Handle gespeichert wird.

    Hier mein Versuch, von dem ich glaube dass er voll daneben ging. Funktioniert aber ohne murren des Compilers.

    #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;
    
    	// Hilfshandle zum Speichern des Vorgängers
    
    	listenelement ^listenende;
    
    	// Durch die Liste gehen, bis das letzte Element erreicht ist
    
    	while (hilfsHandle -> next != nullptr)
    	{
    		hilfsHandle = hilfsHandle -> next;
    	}
    
    	// Aktuelle Adresse im Listenende speichern
    
    	listenende = hilfsHandle;
    
    	// 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 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ä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 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 1";
    
    	// in einer Schleife mehrere Elemente einfügen
    
    	for (Int32 schleife = 2; schleife < 4; schleife++)
    
    		anhaengen("Element " + schleife, listenanfang);
    
    	// die Liste ausgeben
    
    	ausgeben(listenanfang);
    
    	Console::Read();
    
        return 0;
    }
    

    Währe sehr Dankbar, wenn ihr mir das noch mal für Dummies erklären könntet. Das nächste Arbeitsheft beschäftigt sich mit der "Einführung in die objektorientierte Programmierung". Wird schwer zu verstehen sein, wenn ich nicht einmal die verketteten Listen verstehen. Obwohl auf den Zeichnungen alles klar ist, ist es schwer für einen Anfänger das ganze in Code zu fassen.

    Übrigens muss ich ab den 2. Januar wieder in die Schule, und habe dann wieder weniger Zeit hier rein zu schauen. Nur so als Hinweis, wenn ich mich länger nicht melde.

    Lieben Dank

    champman


Anmelden zum Antworten