Показать сообщение отдельно
Старый 19.04.2012, 08:50   #4
Жека
Дэвелопер
 
Регистрация: 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), наверное быстро.
Миниатюры
Нажмите на изображение для увеличения
Название: list.png
Просмотров: 937
Размер:	17.0 Кб
ID:	16667  
(Offline)
 
Ответить с цитированием