Arbres + exemple

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Arbres + exemple

Message par Dr. Dri »

C'est le genre de code qu'on a déjà vu sur le forum
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