Buchempfehlung
MySQL kurz & gut
MySQL kurz & gut
Das preiswerte Taschen- buch stellt MySQL-rele- vante Inhalte systematisch und knapp dar, sodass es sich optimal zum Nach- schlagen beim Pro- grammieren eignet. [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

DoubleLinkedList

Uploader:MitgliedThePuppetMaster
Datum/Zeit:20.12.2011 14:31:19

'##############################################################################################################
Type LinkedList_Type                            'Die Typenstruktur für eine Doppelt Verkettete Liste
    V_NextPtr       as LinkedList_Type Ptr      'Der Pointer auf den Vorherigen Eintrage
    V_PrevPtr       as LinkedList_Type Ptr      'Der Pointer auf den nächsten Eintrag
    V_Data          as String                   'Die eigentlichen Daten
End Type
'---------------------------------------------------------------------------------------------------------------
Dim Shared LinkedList_FirstPtr  as LinkedList_Type Ptr      'Der Pointer auf den absolut ersten Eintrag in der Liste
Dim Shared LinkedList_LastPtr   as LinkedList_Type Ptr      'Der Pointer auf den absolut letzten Eintrag in der Liste



'##############################################################################################################
Function LL_GetPtr(ByRef V_Index as UInteger) as LinkedList_Type Ptr    'Funktion die einen Pointer per Indexnummer zurück gibt.
If V_Index = 0 Then Return 0                                'Ist die Indexnummer 0, dann Funktion mit Pointer-0 verlassen.
Dim C as UInteger                                           'Zählervariable
Dim TempPtr as LinkedList_Type Ptr = LinkedList_FirstPtr    'Ersten Pointer der Liste in eine temporäre Variable speichern
Do Until TempPtr = 0                                        'Schleife solange wiederholen, bis die Variable den Wert 0 enthält.
    C += 1                                                  'Wenn Pointer noch ungleich 0, dann zähler + 1 ...
    If C = V_Index Then Return TempPtr                      '... und prüfen ob zählervariable genausogros wie die Indexnummer. Wenn ja, dann Pointer zurückgeben und Function verlassen
    TempPtr = TempPtr->V_NextPtr                         'Wenn nicht, dann in die Temporäre Variable die Pointeradresse des nächsten Elementes speichern.
Loop
Return 0                                                    'Wenn die schleife verlassen wurde, dann Funktion mit Pointer-0 verlassen.
End Function

'---------------------------------------------------------------------------------------------------------------
Sub LL_Clear()                                              'Funktion um Liste zu leeren.
Do Until LinkedList_FirstPtr = 0                            'Schleife solange durchgehen, bis die Erste Adresse 0 ist.
    LinkedList_LastPtr = LinkedList_FirstPtr->V_NextPtr      'In der Variable des Letzten Pointers den nächsten speichern
    DeAllocate(LinkedList_FirstPtr)                         'Aktuellen Pointer löschen
    LinkedList_FirstPtr = LinkedList_LastPtr                'aktuellen durch nächsten Pointer ersetzen.
Loop
End Sub

'---------------------------------------------------------------------------------------------------------------
Sub LL_Del(ByRef V_Index as UInteger)                                               'Funktion um einen Eintrag zu löschen
If V_Index = 0 Then Exit SUb                                                        'Wenn Indexnummer = 0 dann sub verlassen.
Dim TempPtr as LinkedList_Type Ptr = LL_GetPtr(V_Index)                             'Variable erzeugen in dem per GetPtr Funktion den Pointer zum Index gespeichert wird.
If TempPtr = 0 Then Exit Sub                                                        'Ist dieser Pointer 0, dann wurde kein Element gefunden, daher Funktion verlassen.
If LinkedList_FirstPtr = TempPtr Then LinkedList_FirstPtr = TempPtr->V_NextPtr       'Wenn absolut erster eintrag der zu löschende Pointer ist, dann als neuen absolut ersten den nächsten des zu löschenden setzen
If LinkedList_LastPtr = TempPtr Then LinkedList_LastPtr = TempPtr->V_PrevPtr     'Wenn aboslut letzter eintrag der zu löschende pointer, dann diesen durch vorherigem des zu löschenden setzen.
If TempPtr->V_PrevPtr <> 0 Then TempPtr->V_PrevPtr->V_NextPtr = TempPtr->V_NextPtr    'Wenn vor dem zu löschendem noch ein eintrag existiert, dann im vorherigem pointer, als nächsten den nächsten des zu löschenden eintragen
If TempPtr->V_NextPtr <> 0 Then TempPtr->V_NextPtr->V_PrevPtr = TempPtr->V_PrevPtr    'selbes prinzip für den nächsten, wenn vorhanden.
DeAllocate(TempPtr)                                                                 'zu löschenden pointer löschen und die daten leeren und freigeben.
End Sub

'---------------------------------------------------------------------------------------------------------------
Sub LL_Add(V_Data as String)                                                'Neuen Eintrag hinzufügen / an liste anhängen
If LinkedList_LastPtr <> 0 Then                                               'Wenn die Liste nicht leer ist ...
    LinkedList_LastPtr->V_NextPtr = CAllocate(SizeOf(LinkedList_Type))       '... dann im letzten eintrag, in der nextPtr einen neuen Pointer für ein Speicherstück erzeugen mit der Gröse des Datentyps
    LinkedList_LastPtr->V_NextPtr->V_PrevPtr = LinkedList_LastPtr         'Im neuem element den eintrag für den vorherigen pointer mit dem noch aktuellem letzten pointer setzen
    LinkedList_LastPtr = LinkedList_LastPtr->V_NextPtr                       'den neuen letzten pointer auf dem vorher erzeugtem neuen pointer setzen
Else                                                                        'wenn liste noch leern ...
    LinkedList_LastPtr = CAllocate(SizeOf(LinkedList_Type))                 '... dann neuen Pointer erzeugen (wie oben)
    LinkedList_FirstPtr = LinkedList_LastPtr                                'und diesen neuen und letzten pointer auch als ersten pointer setzen. (erstes udn einzigstes element)
End If
LinkedList_LastPtr->V_Data = V_Data                                          'Die Daten in den neuen Pointer schreiben
End Sub