Es gibt ja nun Listen in Strukturen, also habe ich mal versuch diese FUnktion für ganze Baumstrukturen zu nutzen.
Es ist zwar nach wie vor verboten Rekursive Strukturen zu bauen:
Code: Alles auswählen
Structure Tree
List SubTree.Tree()
EndStructure
Vorinformation über die Größe von Listen in Structuren:
Code: Alles auswählen
Structure StructureList1
List *Child()
EndStructure
Structure StructureList2
List Child.s()
EndStructure
Structure SubStructure
Long.l
Byte.b
Quad.q
EndStructure
Structure StructureList3
List Child.SubStructure()
EndStructure
Debug SizeOf(StructureList1)
Debug SizeOf(StructureList2)
Debug SizeOf(StructureList3)
Also 2*Integer
Hier ein Beispielcode für eine mögliche Nutzung von Bäumen mittels Listen:
Code: Alles auswählen
;##################################################################################################################
Structure Tree
Text$
List *Child.Tree() ; Liste der Pointer der Unterelemente
EndStructure
Procedure CreateChild(*Tree.Tree, Text$="")
AddElement(*Tree\Child()) ; Hinzufügen eines neuen Elements in der Liste
*Tree\Child() = AllocateMemory(SizeOf(Tree)) ; Reservierung des Speichers für einen komplett neuen Baum
InitializeStructure(*Tree\Child(), Tree) ; Initialisierung der Struktur mit Liste im neu angelegten Speicher
*Tree\Child()\Text$ = Text$
ProcedureReturn *Tree\Child()
EndProcedure
Procedure DebugTree(*Tree.Tree, Level=0)
Debug Space(Level)+*Tree\Text$
ResetList(*Tree\Child())
While NextElement(*Tree\Child())
DebugTree(*Tree\Child(), Level+3)
Wend
EndProcedure
Tree.Tree
Tree\Text$ = "Root"
CreateChild(Tree, "Child 1")
CreateChild(Tree, "Child 2")
CreateChild(Tree\Child(), "SubChild 2.1")
CreateChild(Tree\Child(), "SubChild 2.2")
CreateChild(Tree\Child(), "SubChild 2.3")
CreateChild(Tree\Child()\Child(), "SubSubChild 2.3.1")
CreateChild(Tree\Child()\Child(), "SubSubChild 2.3.2")
CreateChild(Tree\Child(), "SubChild 2.4")
*Child = CreateChild(Tree, "Child 3")
CreateChild(*Child, "SubChild 3.1")
CreateChild(*Child, "SubChild 3.2")
DebugTree(Tree)