Полезные коды для 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

Автор поста Igor

Понравился пост? Подпишитесь на RSS ленту или Twitter.
1 Звезда2 Звезды3 Звезды4 Звезды5 Звезд (3 votes, average: 2,00 из 5)
Loading ... Loading ...
Рубрика Blitz3D, Логика
Теги:

Похожие записи

Оставить комментарий