Полезные коды для Blitz3D №2
Бывают случаи, когда нужно объединить несколько типов в группу. Например объекты одной части карты игры от, другой. Но как это сделать без массивов? Помогут нам в этом связнанные списки. Они представляют собой цепочку элементов в каждом из которых есть ссылка на предыдущий и следующий тип. Концы этой цепочки хранятся в специальном типе списка. Собственно вот шаблон:
Type TList
Field FirstLink.TLink
Field LastLink.TLink
End Type
Type TLink
Field PrevLink.TLink
Field NextLink.TLink
End Type
Function UnboundLink(Link.TLink)
If LinkPrevLink<>Null Then LinkPrevLinkNextLink=LinkNextLink
If LinkNextLink<>Null Then LinkNextLinkPrevLink=LinkPrevLink
LinkPrevLink=Null
LinkNextLink=Null
End Function
;Insert Link to top of list
Function InsertFirst(List.TList, Link.TLink)
UnboundLink(Link)
If ListFirstLink<>Null
LinkNextLink=ListFirstLink
ListFirstLinkPrevLink=Link
ListFirstLink=Link
Else
ListFirstLink=Link
ListLastLink=Link
EndIf
End Function
;Insert Link to end of list
Function InsertLast(List.TList, Link.TLink)
UnboundLink(Link)
If ListLastLink<>Null
LinkPrevLink=ListLastLink
ListLastLinkNextLink=Link
ListLastLink=Link
Else
ListFirstLink=Link
ListLastLink=Link
EndIf
End Function
;Insert LinkA before LinkB
Function InsertBefore(LinkA.TLink, LinkB.TLink)
LinkAPrevLink=Null
LinkANextLink=Null
If LinkBPrevLink=Null
LinkBPrevLink=LinkA
LinkANextLink=LinkB
Else
LinkAPrevLink=LinkBPrevLink
LinkBPrevLinkNextLink=LinkA
LinkBPrevLink=LinkA
EndIf
End Function
;Insert LinkA after LinkB
Function InsertAfter(LinkA.TLink, LinkB.TLink)
LinkAPrevLink=Null
LinkANextLink=Null
If LinkANextLink=Null
LinkBNextLink=LinkA
LinkAPrevLink=LinkB
Else
LinkANextLink=LinkBNextLink
LinkBNextLinkPrevLink=LinkA
LinkBNextLink=LinkA
EndIf
End Function
Function DeleteLink(Link.TLink)
UnboundLink(Link)
Delete Link
End Function
Проходим циклом по списку вперёд:
; Loop through list forward
Local Link.TLink=ListFirstLink
While Link<>Null
;Code
Link=LinkNextLink
Wend
Проходим циклом по списку назад:
; Loop through list backward
Local Link.TLink=ListLastLink
While Link<>Null
;Code
Link=LinkPrevLink
Wend
Автор поста

