Сообщение от 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, вдруг текущий элемент окажется первым.