Здравствуйте, смотрел FAQ и набирал в поиске, но не нашел алгоритмов организации и реализации основных операций над кольцевыми двусвязными списками, может быть у кого-нибудь найдется этот материал, а то все никак не разберусь, заранее спасибо.
volvo
6.01.2007 19:10
Что именно тебе не понятно? Как организуются кольцевые списки? Как делать проход по такому списку? ЧТО?
Все почти аналогично обычному линейному списку, за исключением одной маленькой детали...
User88
6.01.2007 19:27
Да, как они организуются(именно двусвязные кольцевые): добавление первого и последующих элементов, ну и удаление элементов из такого списка.
мисс_граффити
6.01.2007 21:54
двусвязный НЕкольцевой (линейный) понимаешь, как делается? то есть в FAQ он есть... но ты - понимаешь? если да, остается два указателя поменять: с первого элемента должен идти на последний, а с последнего - на первый (а в линейном там nil).
User88
7.01.2007 1:43
То есть процедура добавления элемента в список должна выглядеть так?
Procedure Add(X : Telem; Var L : TList); Var P : TList; L1:Tlist; Begin if L=nil then begin L:=New(TList); L^.Next:=L; L^.Prev:=L; L^.Data:=X; end else begin P:=New(TList); P^.Data:=X; P^.Next:=L^.Next; L^.Next^.Prev:=P; P^.Prev:=L; L^.Next:=P; end; End;
М
Теги не забываем... мисс_граффити
volvo
7.01.2007 2:10
не совсем... Ты запутался, по-моему, с указателями... Вот так:
Procedure Add(X : Telem; Var L : TList); Var P : TList; Begin if L=nil then begin L:=New(TList); L^.Next:=L; L^.Prev:=L; L^.Data:=X; end else begin P:=New(TList); P^.Data:=X; P^.prev := L^.prev; { <--- Предыдущее для вновь добавленного значения } P^.next := L; { <--- Следующее для вновь добавленного - всегда начало списка } L^.prev^.next := P; { <--- Обновляем "бывший" последний элемент } L^.prev := P; { <--- Предыдущий для первого элемента } end; End;
User88
7.01.2007 14:32
Понял, спасибо!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.