Liste chainée, qu'est-ce exactement?
Publié : lun. 07/juin/2004 6:50
Il y a eu un tut sur les liste chainée de PB, mais je pense que pour bien comprendre comment elle fonctionne, il faut savoir les faire artisanalement... donc voilas un petit code commenté
logiquement, en faisant vos liste artisanalement, vous devriez pouvoir imbriquer une liste dans une liste (bien que se soit delicat... un movaise boucle, et c'est la boucle infini...) enfin bon, si vous avez des questions, n'hesitez pas
(ou si j'ai fait une connerie dans le code lol)

Code : Tout sélectionner
Structure Element ; notre structure pour la liste chainée
*NextElement.l ; pointeur vers l'element suivant
*PreviousElement.l ; pointeur vers l'element precedant (non utiliser dans cet exemple, mais facilement utilisable si vous avez compris comment marche NextElement
Value.l ; et enfin, une valeur
EndStructure
Test.Element ; ici, notre premier element
Test\NextElement = #NULL ; pas d'element suivant.. donc NULL
Test\PreviousElement = #NULL ; pas d'element precedant.. donc NULL
Test\Value = 10 ; et une valeur
Test2.Element ; notre 2eme element
Test\NextElement = @Test2 ; donc on reprend notre premier element et on fait pointer NextElement vers notre 2eme element
Test2\PreviousElement = @Test ; on fait pointer PreviousElement de notre 2eme element vers notre premier Element
Test2\NextElement = #NULL ; pas d'element suivant donc NULL
Test2\Value = 20 ; encor une valeur (euh... au cas ou vous n'auriez pas compris, value ici ne sert a rien, c'est juste pour apres voir si c'est bon.... :)
Test3.Element ; jamais 2 sans 3... notre 3eme element
Test2\NextElement = @Test3 ; donc on reprend notre 2eme element et on fait pointer NextElement vers notre 3eme element
Test3\PreviousElement = @Test2 ; toujour pareil... on fait pointer PreviousElement de notre 3eme element vers notre 2eme element
Test3\NextElement = #NULL ; pas d'element suivant
Test3\Value = 30 ; encore une valeur (on a dit jamais 2 sans 3 :p)
Procedure Debugtest(*Lst.Element) ; une proc qui va nous faire defiller la chaine (j'aurai bien pu faire un proc AddElement mais bon... si vous avez compris jusque la, pas de soucis :)
; donc on a un pointeur vers un element (*Lst)
EndLst = 0 ; va nous servir a terminer la boucle
Repeat
Debug *Lst\Value ; on debug la valeur de l'element
If *Lst\Nextelement = #NULL ; ensuite si NextElement de l'element courant est NULL, sa veut dir qu'il n'y a pas d'element suivant, donc on arrete la
EndLst =1 ; hop
Else ; sinon
*Lst = *Lst\NextElement ; et bien l'element courant (*Lst) devient l'element suivant de l'element courant
EndIf
Until EndLst = 1 ; finished
EndProcedure
Debugtest(@Test) ; on test a partir de l'element Test, et normalement le debug renvoi 10 puis 20 puis 30
