Cette lib permet de faire des listes chainées simple; c'est pour cela qu'il n'y a pas de PreviousElement() par exemple.
Code source de la Lib:
Code : Tout sélectionner
;/ Les fonctions:
;----------------------------
;/ CreateList(size.l) crée une nouvelle liste chainée et renvoie un index
;/ et retourne la référence de la liste
;/ Count_Element() compte le nombre d'élément
;/ First_Element() renvoie le premier élément
;/ Current_element() renvoie l'élément courant
;/ Next_Element() élément suivant
;/ Delete_element() éfface l'élément courant
;/ DestructList() détruit la liste chainée courante
;/ UseList(index.l) la liste de cette index devient la liste courante
;----------------------------
;----------------------------
ProcedureDLL CreateList_Init()
Structure _liste
*Pointeur_debut
*Pointeur_fin
*pointeur_courant
size_struct.l
flag.b
count.l
index.l
EndStructure
NewList liste._liste()
Global index_courant.l
EndProcedure
Procedure FindList(ref.l)
ForEach liste()
If liste()\index=ref
ProcedureReturn 1
EndIf
Next
ProcedureReturn 0
EndProcedure
ProcedureDLL CreateList(size.l)
Static index.l
index=index+1
AddElement(liste())
liste()\index=index
liste()\size_struct = size + 4
liste()\Pointeur_debut=0
liste()\Pointeur_fin=0
liste()\flag=0
liste()\count=0
index_courant=index
ProcedureReturn index
EndProcedure
ProcedureDLL Add_Element()
If FindList(index_courant)
*nouveau=AllocateMemory(liste()\size_struct)
If liste()\Pointeur_debut=0
liste()\count=0
liste()\Pointeur_debut=*nouveau + liste()\size_struct - 4
Else
PokeL(liste()\Pointeur_fin,*nouveau)
EndIf
liste()\count=liste()\count+1
liste()\Pointeur_fin=*nouveau + liste()\size_struct - 4
PokeL(liste()\Pointeur_fin, 0)
liste()\pointeur_courant=liste()\Pointeur_fin
ProcedureReturn *nouveau
EndIf
ProcedureReturn 0
EndProcedure
ProcedureDLL First_Element()
If FindList(index_courant)
If liste()\Pointeur_debut<>0
liste()\flag=0
liste()\pointeur_courant=liste()\Pointeur_debut
ProcedureReturn liste()\Pointeur_debut - liste()\size_struct + 4
EndIf
EndIf
ProcedureReturn 0
EndProcedure
ProcedureDLL Current_Element()
If FindList(index_courant)
If liste()\pointeur_courant<>0
ProcedureReturn liste()\pointeur_courant - liste()\size_struct + 4
EndIf
EndIf
ProcedureReturn 0
EndProcedure
ProcedureDLL End_Element()
If FindList(index_courant)
If liste()\Pointeur_fin
liste()\pointeur_courant=liste()\Pointeur_fin
ProcedureReturn liste()\Pointeur_fin - liste()\size_struct + 4
EndIf
EndIf
ProcedureReturn 0
EndProcedure
ProcedureDLL Next_Element()
If FindList(index_courant)
If liste()\flag=0
suivant=PeekL(liste()\pointeur_courant)
If suivant <> 0
liste()\pointeur_courant = suivant + liste()\size_struct - 4
ProcedureReturn suivant
EndIf
Else
liste()\flag=0
If liste()\Pointeur_debut <> 0
ProcedureReturn liste()\Pointeur_debut - liste()\size_struct + 4
EndIf
EndIf
EndIf
ProcedureReturn 0
EndProcedure
ProcedureDLL Delete_element()
If FindList(index_courant)
If liste()\Pointeur_debut<>0
*pointeur=liste()\Pointeur_debut
Select liste()\pointeur_courant
Case liste()\Pointeur_debut
If PeekL(*pointeur)<>0
liste()\Pointeur_debut=PeekL(*pointeur)+ liste()\size_struct-4
*memory=liste()\pointeur_courant - liste()\size_struct + 4
liste()\pointeur_courant=liste()\Pointeur_debut
liste()\count=liste()\count-1
Else
*memory=liste()\pointeur_courant - liste()\size_struct + 4
liste()\Pointeur_debut=0:liste()\Pointeur_fin=0:liste()\pointeur_courant=0
liste()\count=0
EndIf
liste()\flag=1
Default
While *pointeur
If liste()\pointeur_courant=PeekL(*pointeur)+ liste()\size_struct - 4
*Pointeur_precedent=*pointeur
If liste()\Pointeur_fin=liste()\pointeur_courant
liste()\Pointeur_fin=*Pointeur_precedent
EndIf
*memory=liste()\pointeur_courant - liste()\size_struct + 4
Break
EndIf
*pointeur=PeekL(*pointeur)+ liste()\size_struct - 4
Wend
PokeL(*Pointeur_precedent,PeekL(liste()\pointeur_courant))
*memory=liste()\pointeur_courant - liste()\size_struct + 4
liste()\pointeur_courant=*Pointeur_precedent
liste()\count=liste()\count-1
EndSelect
If *memory
If FreeMemory(*memory)
ProcedureReturn 1
EndIf
EndIf
EndIf
EndIf
ProcedureReturn 0
EndProcedure
ProcedureDLL UseList(ref.l)
If FindList(ref)
index_courant=ref
ProcedureReturn 1
EndIf
ProcedureReturn 0
EndProcedure
ProcedureDLL DestructList()
*liste=First_Element()
While *liste
Delete_element()
*liste=Next_Element()
Wend
ProcedureReturn 1
EndProcedure
ProcedureDLL Count_Element()
If FindList(index_courant)
ProcedureReturn liste()\count
EndIf
ProcedureReturn 0
EndProcedure
ProcedureDLL CreateList_End()
ForEach liste()
If UseList(liste()\index)
DestructList()
EndIf
Next
EndProcedure
Exemple d'utilisation:
Code : Tout sélectionner
Structure liste
valeur.l
EndStructure
index1=CreateList(SizeOf(liste))
*liste.liste=Add_Element()
*liste\valeur=11
*liste=Add_Element()
*liste\valeur=11
*liste=Add_Element()
*liste\valeur=22
*liste=Add_Element()
*liste\valeur=33
*liste=Add_Element()
*liste\valeur=44
Debug Count_Element()
Delete_element()
Delete_element()
*liste=First_Element()
While *liste
If *liste\valeur=11
Delete_element()
EndIf
*liste=Next_Element()
Wend
;
Debug "---------------"
*liste=Add_Element()
*liste\valeur=55
Debug "---------------"
*liste=First_Element()
While *liste
Debug *liste\valeur
*liste=Next_Element()
Wend
Debug "---------------"
DestructList()
Telecharger la Lib:
http://home.tele2.fr/purebasic/Liste_chainee_lib.zip
