
Hab eben für meine neue RayTracing-Engine eine LinkedList gebraucht, die
ich dynamisch erstellen kann, die schnell ist, und nur dazu da ist, Elemente
hinten anzuhängen, aber willkürlich wieder zu löschen.
Außerdem kann man nur entweder ein(en) Byte, Character, Word, Long,
Float, Double, Quad oder String in einem Element speichern. Ich selbst
benutze die Liste um Pointer darin zu speichern.
Hier ist der Code-Schnipsel, falls es jemanden interessieren sollte:
Code: Alles auswählen
Structure RTListElement
*_list.RTList
*_prev.RTListElement
*_next.RTListElement
StructureUnion
b.b
c.c
w.w
l.l
f.f
q.q
d.d
s.s
EndStructureUnion
EndStructure
Structure RTList
*first.RTListElement
*last.RTListElement
count.l
EndStructure
Procedure RTList_Add(*RTList.RTList)
Protected *RTListElement.RTListElement
*RTListElement = AllocateMemory(SizeOf(RTListElement))
If *RTListElement = 0 : ProcedureReturn #False : EndIf
If *RTList\count
*RTListElement\_prev = *RTList\last
*RTList\last\_next = *RTListElement
*RTList\last = *RTListElement
Else
*RTList\first = *RTListElement
*RTList\last = *RTListElement
EndIf
*RTList\count + 1
*RTListElement\_list = *RTList
ProcedureReturn *RTListElement
EndProcedure
Procedure RTList_Del(*RTListElement.RTListElement)
Protected *_activ
If *RTListElement\_list\count = 1
*RTListElement\_list\first = 0
*RTListElement\_list\last = 0
*_activ = 0
ElseIf *RTListElement\_prev = 0
*RTListElement\_next\_prev = 0
*RTListElement\_list\first = *RTListElement\_next
*_activ = *RTListElement\_next
ElseIf *RTListElement\_next = 0
*RTListElement\_prev\_next = 0
*RTListElement\_list\last = *RTListElement\_prev
*_activ = 0
Else
*RTListElement\_next\_prev = *RTListElement\_prev
*RTListElement\_prev\_next = *RTListElement\_next
*_activ = *RTListElement\_next
EndIf
*RTListElement\_list\count - 1
FreeMemory(*RTListElement)
ProcedureReturn *_activ
EndProcedure
Procedure RTList_Clear(*RTList.RTList)
Protected *RTListElement.RTListElement
*RTListElement = *RTList\first
While *RTListElement
If *RTListElement\_next
*RTListElement = *RTListElement\_next
FreeMemory(*RTListElement\_prev)
Else
FreeMemory(*RTListElement)
EndIf
Wend
*RTList\first = 0
*RTList\last = 0
*RTList\count = 0
ProcedureReturn 0
EndProcedure
Macro RTList_First(RTList)
RTList\first
EndMacro
Macro RTList_Last(RTList)
RTList\last
EndMacro
Macro RTList_Next(RTListElement)
RTListElement\_next
EndMacro
Macro RTList_Prev(RTListElement)
RTListElement\_prev
EndMacro
Macro RTList_Count(RTList)
RTList\count
EndMacro
liste.RTList ;Liste erstellen
*element.RTListElement ;Pointer für Elemente erstellen
For a = 1 To 100
*element = RTList_Add(liste)
*element\l = a
Next
Debug RTList_Count(liste)
Debug ""
*element = RTList_First(liste)
While *element
If *element\l % 2 = 0 Or *element\l % 3 = 0 Or *element\l % 5 = 0 Or *element\l % 7 = 0
*element = RTList_Del(*element)
Else
*element = RTList_Next(*element)
EndIf
Wend
Debug "Die Primzahlen zwischen 7 und 100"
*element = RTList_First(liste)
While *element
Debug *element\l
*element = RTList_Next(*element)
Wend
Debug ""
Debug RTList_Count(liste)