fb:porticula NoPaste
Einfaches Listen-Beispiel
Uploader: | MOD |
Datum/Zeit: | 07.11.2010 16:00:33 |
'Ein Beispielcode, wie eine verkette Liste (linked list) aussehen koennte
'Das ist keine Idealloesung und behandelt auch nicht alle Faelle
'Es dient als Anschauungsmaterial wie man so etwas loesen koennte
'Keine Haftung wenn der PC explodiert oder sonstiges ;)
'Das UDT für die Liste
Type linkedList
'diese Variable zeigt immer auf das naechste Element
naechtesElement As linkedList Ptr
'Die Liste benoetigt eine Speicherverwaltung
'das koennte man von außen auch tun, jedoch ist es
'sicherer, das der Liste selbst zu ueberlassen
Declare Function neuesElement (neueDaten As String) As linkedList Ptr
'Ganz wichtig ist es auch, dass die Liste hinter sich
'aufraeumt, wenn sie zerstoert wird
Declare Destructor ()
'Hier liegen die eigentlichen Daten der Liste
daten As String
End Type
'Dieses Array nehmen wir einfach mal, um zu sehen, ob am Ende wirklich alles sauber ist
Dim As UInteger array(4)
'Das ist unsere verkette Liste
Dim As linkedList Ptr myList
myList = New linkedList
'Dies ist ein temporaerer Listenpointer um leichter auf naechste Elemente zuzugreifen
Dim As linkedList Ptr tempList = myList
'Daten ins erste Element eingeben, Pointer anzeigen und gleichzeitig Pointer im Array fuer spaeter speichern
tempList->daten = "Hallo, "
Print "Erstes Element: " & tempList:array(0) = Cast(Integer, tempList)
'Die naechsten Punkte sind wie oben, nur das zusaetzlich ein neues Element angefuegt
'und der Pointer ueberprueft werden muss
If tempList->neuesElement("ich bin ") <> 0 Then
tempList = tempList->naechtesElement
Print "Zweites Element: " & tempList:array(1) = Cast(Integer, tempList)
Else
Print "Kein neues Listenelement erstellt"
EndIf
If tempList->neuesElement("eine verkettete ") <> 0 Then
tempList = tempList->naechtesElement
Print "Drittes Element: " & tempList:array(2) = Cast(Integer, tempList)
Else
Print "Kein neues Listenelement erstellt"
EndIf
If tempList->neuesElement("Liste!!!") <> 0 Then
tempList = tempList->naechtesElement
Print "Viertes Element: " & tempList:array(3) = Cast(Integer, tempList)
Else
Print "Kein neues Listenelement erstellt"
EndIf
Print:Print "------------------------":Print
'Alle Listenelemente anzeigen lassen
tempList = myList
Do While tempList <> 0
Print tempList->daten
tempList = tempList->naechtesElement
Loop
Print:Print "------------------------":Print
'Mit der Zerstoerung der Liste beginnen
Print "Dieser Pointer wird zerstoert: " & myList
Delete myList
Print:Print "------------------------":Print
'Am Ende nochmal schauen, ob die Pointer wirklich frei sind
'Das ist nur eine Sicherheitsabfrage und wuerde am Ende entfernt werden
'Das dient hier nur um zu zeigen, dass die Liste wirklich weg ist
Print "Wenn wirklich alles zerstoert wurde, stehen nun keine Daten hinter den Pointern"
For i As Integer = 0 To 3
Print array(i), Cast(linkedList Ptr, array(i))->daten
Next
Sleep
'Fuegt ein neues Element an die Liste an
Function linkedList.neuesElement (neueDaten As String) As linkedList Ptr
This.naechtesElement = New linkedList
'Falls kein Speicher alloziiert wurde, ist der Pointer NULL und damit ungueltig
If This.naechtesElement = 0 Then
Return 0
Else
Print "Habe neues Element erstellt: " & This.naechtesElement
This.naechtesElement->daten = neueDaten
Return This.naechtesElement
EndIf
End Function
'Zerstoert alle nachfolgenden Listenelemente
Destructor linkedList ()
Dim As linkedList Ptr temp = This.naechtesElement
If temp <> 0 Then
Print "Dieser Pointer wird zerstoert: " & temp
Delete temp
EndIf
End Destructor