Бывают случаи, когда нужно объединить несколько типов в группу. Например объекты одной части карты игры от, другой. Но как это сделать без массивов? Помогут нам в этом связнанные списки. Они представляют собой цепочку элементов в каждом из которых есть ссылка на предыдущий и следующий тип. Концы этой цепочки хранятся в специальном типе списка. Собственно вот шаблон:

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

(Visited 170 times, 1 visits today)