Дэвелопер
Регистрация: 04.09.2005
Адрес: Красноярск
Сообщений: 1,376
Написано 491 полезных сообщений (для 886 пользователей)
|
Ответ: Связанные списки?...
Можно сделать свои собственные связные списки.
Я сделал двусвязный список с добавлением данных в конец, можно пробегать с начала до конца и с конца до начала.
Вставку в начало и удаление элемента добавить легко и просто.
Вместо знакомого For ... Each ... Next здесь получаем
link = first link
while link <> null
....
link = next link
wend
Вот мой примерчик кода:
SeedRnd(MilliSecs())
Local list1.TList = fnListCreate()
Local list2.TList = fnListCreate()
Local d.TData, p.TParam, k%
For k% = 1 To 5
d = New TData
d\txt = "1st list, data №"+k
p = New TParam
p\andle = Rnd(0,360)
p\name = Chr(Rand(30,255))+Chr(Rand(30,255))+Chr(Rand(30,255))+Chr(Rand(30,255))+Chr(Rand(30,255))
d\param = p
fnListAdd(list1, Handle(d)) ;добавляем в первый список
Next
For k% = 1 To 3
d = New TData
d\txt = "2nd list, data №"+k
p = New TParam
p\andle = Rnd(0,360)
p\name = Chr(Rand(30,255))+Chr(Rand(30,255))+Chr(Rand(30,255))+Chr(Rand(30,255))+Chr(Rand(30,255))
p\kind = Rand(10)
d\param = p
fnListAdd(list2, Handle(d)) ;добавляем во второй список
Next
Graphics 600,600,0,2
SetFont(LoadFont("Arial Cyr", 16))
Local link.TLink, y% = 10
;проход по первому списку
link = fnListFirstLink(list1)
While(link <> Null)
d = Object.TData(link\objPtr)
y = fnDataPrint(d, 10, y)
y = y + 10
link = fnNextLink(link)
Wend
;проход по второму списку
link = fnListFirstLink(list2)
y = 10
While(link <> Null)
d = Object.TData(link\objPtr)
y = fnDataPrint(d, 200, y)
y = y + 10
link = fnNextLink(link)
Wend
;проход по второму списку c конца
link = fnListLastLink(list2)
y = 10
While(link <> Null)
d = Object.TData(link\objPtr)
y = fnDataPrint(d, 400, y)
y = y + 10
link = fnPrevLink(link)
Wend
WaitMouse
End
Function fnListCreate.TList()
Local list.TList = New TList
;list\root = New TLink
Return list
End Function
Function fnListAdd.TLink(list.TList, dataPtr%)
Local newLink.TLink = New TLink
newLink\objPtr = dataPtr ;в качестве данных храним указатель на тип с данными, Handle
If(list\firstLink = Null)
list\firstLink = newLink ;запоминаем первый элемент
list\lastLink = newLink
Else
Local lastLink.TLink = list\lastLink
lastLink\nextLink = newLink
newLink\prevLink = lastLink
list\lastLink = newLink
EndIf
list\count=list\count+1
Return newLink
End Function
Function fnListIsEmpty%(list.TList)
Return (list\count = 0)
End Function
Function fnListFirstLink.TLink(list.TList)
Return list\firstLink
End Function
Function fnNextLink.TLink(link.TLink)
Return link\nextLink
End Function
Function fnListLastLink.TLink(list.TList)
Return list\lastLink
End Function
Function fnPrevLink.TLink(link.TLink)
Return link\prevLink
End Function
Function fnDataPrint%(d.TData, x=0, y=0)
Local fh% = FontHeight()
Text x,y, d\txt+" {"
Text x,y+fh, " name: "+d\param\name
Text x,y+2*fh, " kind: "+d\param\kind
Text x,y+3*fh, " x,y,z: "+d\param\x+","+d\param\y+","+d\param\z
Text x,y+4*fh, " angle: "+d\param\andle
Text x,y+5*fh, "}"
Return y+6*fh
End Function
Type TList
Field count%
Field firstLink.TLink
Field lastLink.TLink
End Type
Type TLink
Field objPtr%
Field nextLink.TLink
Field prevLink.TLink
End Type
Type TData
Field txt$
Field param.TParam
End Type
Type TParam
Field x#,y#,z#
Field andle#
Field kind%
Field name$
End Type
UPD: т.к. в качестве данных хранится Handle, то хранить можно любые данные Type.
Не знаю насколько быстро работает d = Object.TData(link\objPtr), наверное быстро.
|