![](images/chestnut/misc/left.gif) |
2D-программирование Вопросы, касающиеся двумерного программирования |
19.04.2012, 02:09
|
#1
|
AnyKey`щик
Регистрация: 27.08.2007
Сообщений: 17
Написано одно полезное сообщение
|
Связанные списки?...
Проясните один момент пожалуйста.
Хочется освоить работу со связанными списками.
Но вот в чем заминка.
Имеем например: Список second и Список first
In first type включаем second type
Вопрос в следующем, вне зависимости сколько раз я создам первый список и в нем второй, содержимое второго все равно будет в общей куче второго списка, а не принадлежать свеже созданному списку first?
Блин... изложил как сумел. Поймите кто нибудь мои непонятные мысли.
|
(Offline)
|
|
19.04.2012, 02:15
|
#2
|
AnyKey`щик
Регистрация: 27.08.2007
Сообщений: 17
Написано одно полезное сообщение
|
Ответ: Связанные списки?...
Например нужно получить следующее:
Создаем список Window с набором параметров, такие как координаты, размер, ну и др. мишура.
Дальше для этого окна создаем вторым (связанным) списком набор гаджетов (кнопки, флажки, текст боксы и пр. мишура).
Вот здесь и хотелось бы, чтобы гаджеты и прочая мишура второго списка принадлежали бы только своему окну, а не висели кучей в списке номер 2.
Вообще не могу понять, в чем смысл например таких записей:
one.list = new list
one\параметр = что нибудь
one.list = new list
one\параметр = другое что нибудь
two.list = new list
two\параметр = что нибудь
если например
for one.list = each list
print one\параметр
next
в итоге выдаст полностью все содержимое списка и с указателем one и указателем two.
для чего тогда нужны указатели?
Конечно я мог бы например во втором списке завести переменную куда бы записывал handl первого списка, (ну типа только моё), но тогда у меня в голове теряется смысл связанных списков. Можно вести таким же образом два независимых списка.
В общем идея связанных списков на мой взгляд ГЕНИАЛЬНАЯ, но пока в меру своей ограниченной не просвятленности, реализация таковых мне кажется туповатой.
structure в Си как то почетче... ![Mad](images/smilies/mad.gif)
|
(Offline)
|
|
19.04.2012, 08:49
|
#3
|
Бывалый
Регистрация: 16.09.2011
Сообщений: 863
Написано 257 полезных сообщений (для 546 пользователей)
|
Ответ: Связанные списки?...
two и one это указатели на элемент списка.
for one.list = each list
тут каждый шаг цикла one присваивается какой то элемент списка, по порядку.
one это только название, вместо него можно было бы прописать что угодно.
Если хочеш два разных списка, то
либо создаешь 2 списка
type window
field lol
endtype
type gadjeti
field lol
endtype
и работаеш с тем который тебе нужен сейчас.
либо делаеш один, но
type window
field ListType
field lol
endtype
Если у тя гаджет, то присваиваеш ListType=1, если виндоус, то присваиваш ListType=0.
for one.window = each window
if ListType=0
print window\lol
endif
next
|
(Offline)
|
|
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
Вот мой примерчик кода:
![](images/chestnut/misc/code_html.gif)
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), наверное быстро. ![:)](images/smilies/smile.gif)
|
(Offline)
|
|
19.04.2012, 13:57
|
#5
|
Разработчик
Регистрация: 09.08.2006
Адрес: Украина
Сообщений: 431
Написано 65 полезных сообщений (для 53 пользователей)
|
Ответ: Связанные списки?...
Самая отличная статья увиденная мной про списки. Что б понять как организовано именно связь между списками мне пришлось прочитать статью раза три в свое время. Но если понять, таких проблем как у тебя появляться больше не должно:
Журнал Blitz Et Cetera - Связанные списки в Blitz3D
п.с. И вообще.... Советую почитать в этом журнале больше чем эту статейку...
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 03:41.
|