Показать сообщение отдельно
Старый 22.04.2011, 21:24   #2
Venom2
 
Сообщений: n/a
Ответ: Послдений не Null в списке

Сообщение от NitE Посмотреть сообщение
Подскажите пожалуйста, как мне из списка получить первый, не-нулевой предыдущий элемент.

current:mytype=mytype(ListFindLink(mylist,current) .prevlink().value())

Вот такой код работает отлично, пока из середины списка что-нибудь не пропадет.
К примеру у меня 4 экземпляра типа, current в данный момент 4, а 3 удаляется (т.е. listremove()), если попытатся выполнить данный код, то вылетает с ошибкой доступа к Null элементу. А надо чтобы просто проскачил на 2 элемент.

Надеюсь понятно объяснил.
Лучше у каждого экземпляра MyType хранить ссылку TLink на добавляемый элемент. Тогда не надо будет использовать медленный ListFindLink, который для поиска перебирает список, и заодно решается описаная тобой проблема:

Framework BRL.Blitz
Import BRL.LinkedList

Type MyType
	
	Field Link : TLink
	
End Type

Local MyList : TList = CreateList()

Local Element1 : MyType = New MyType
Element1.Link = ListAddLast(MyList, Element1)

Local Element2 : MyType = New MyType
Element2.Link = ListAddLast(MyList, Element2)

Local Element3 : MyType = New MyType
Element3.Link = ListAddLast(MyList, Element3)

Local Element4 : MyType = New MyType
Element4.Link = ListAddLast(MyList, Element4)

Local CurrentElement : MyType = Element4

ListRemove(MyList, Element3)

CurrentElement = MyType(CurrentElement.Link.PrevLink().Value())

If CurrentElement <> Element2 Then RuntimeError("Oh shit!")

End
Естественно PrevLink() надо проверять на Null, вдруг текущий элемент окажется первым.
 
Ответить с цитированием
Сообщение было полезно следующим пользователям:
NitE (23.04.2011)