fb:porticula NoPaste
DoubleLinkedList
Uploader: | ThePuppetMaster |
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