Buchempfehlung
Windows-Programmierung. Das Entwicklerhandbuch zur WIN32-API
Windows-Programmierung. Das Entwicklerhandbuch zur WIN32-API
"Der" Petzold, das über 1000 Seiten starke Standardwerk zum Win32-API - besonders nützlich u. a. bei der GUI-Programmierung in FreeBASIC! [Mehr Infos...]
FreeBASIC-Chat
Es sind Benutzer im FreeBASIC-Chat online.
(Stand:  )
FreeBASIC bei Twitter
Twitter FreeBASIC-Nachrichten jetzt auch über Twitter erhalten. Follow us!

fb:porticula NoPaste

Info
Info / Hilfe
Liste
Übersicht / Liste
Neu
Datei hochladen
Suche
Quellcode suchen
Download
Dateidownload

Einfaches Listen-Beispiel

Uploader:RedakteurMOD
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