Voila un petit code pour manipuler des arbres de String
Parce que trop la flemme de gérer n'importe quel type
C'est loin d'être fini mais c'est calqué sur les listes chaînées
de PB (en gros on a une liste vide ou un élément courant)
La fonction FreeNode n'est pas terminée, en fait elle fonctionne
de paire avec DeleteNode qui n'existe pas encore...
En gros pour les arbres :
Un arbre (tree) est constitué de noeuds (node)
Chaque noeud peut contenir plusieurs noeud fils (children)
Chaque noeud fils a un père (superior)
Les Noeuds fils d'un même père sont frères (siblings)
La racine (root) de l'arbre n'a ni père ni frère
Code : Tout sélectionner
EnableExplicit
Structure Node
Element.s
nNodes.l
*Superior.Node
*Siblings.Node
*Children.Node
EndStructure
Structure Tree
*Current.Node
EndStructure
Procedure.l NewTree()
ProcedureReturn AllocateMemory( SizeOf(Tree) )
EndProcedure
Procedure.l IsEmpty(*Tree.Tree)
ProcedureReturn (Not *Tree\Current)
EndProcedure
Procedure.l IsRoot(*Tree.Tree)
Protected *Root.Node
*Root = *Tree\Current
If *Root And *Root\Superior
*Root = #Null
EndIf
ProcedureReturn *Root
EndProcedure
Procedure.l GetRoot(*Tree.Tree)
Protected *Root.Node
*Root = *Tree\Current
If *Root
While *Root\Superior
*Root = *Root\Superior
Wend
EndIf
ProcedureReturn *Root
EndProcedure
Procedure.l AddNode(*Tree.Tree)
Protected *Node.Node
*Node = AllocateMemory( SizeOf(Node) )
Debug *Node
If *Tree\Current
*Tree\Current\nNodes + 1
If *Tree\Current\Children
*Tree\Current = *Tree\Current\Children
While *Tree\Current\Siblings
*Tree\Current = *Tree\Current\Siblings
Wend
*Tree\Current\Siblings = *Node
*Tree\Current = *Tree\Current\Superior
Else
*Tree\Current\Children = *Node
EndIf
EndIf
If *Node
*Node\Superior = *Tree\Current
*Tree\Current = *Node
EndIf
ProcedureReturn *Node
EndProcedure
Procedure.l InsertNode(*Tree.Tree)
Protected *Node.Node
*Node = AllocateMemory( SizeOf(Node) )
If *Tree\Current
*Tree\Current\nNodes + 1
If *Tree\Current\Children
*Tree = *Tree\Current\Children
*Node\Siblings = *Tree\Current
*Tree\Current = *Tree\Current\Superior
*Tree\Current\Children = *Node
Else
*Tree\Current\Children = *Node
EndIf
EndIf
If *Node
*Node\Superior = *Tree\Current
*Tree\Current = *Node
EndIf
ProcedureReturn *Node
EndProcedure
Procedure.l FreeNode(*Node.Node)
Protected Free.l = #True, *Temp.Node
If *Node
Free & FreeNode(*Node\Children)
*Temp = *Node
*Node = *Node\Siblings
Free & FreeMemory(*Temp)
While *Node
Free & FreeNode(*Node\Children)
*Temp = *Node
*Node = *Node\Siblings
Free & FreeMemory(*Temp)
Wend
EndIf
ProcedureReturn Free
EndProcedure
Procedure.l ClearTree(*Tree.Tree)
ProcedureReturn FreeNode( GetRoot(*Tree) )
EndProcedure
Procedure.l FreeTree(*Tree.Tree)
ProcedureReturn FreeNode( GetRoot(*Tree) ) & FreeMemory(*Tree)
EndProcedure