Здравствуйте, смотрел 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;
Beginif L=nilthenbegin
L:=New(TList);
L^.Next:=L;
L^.Prev:=L;
L^.Data:=X;
endelsebegin
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;
Beginif L=nilthenbegin
L:=New(TList);
L^.Next:=L;
L^.Prev:=L;
L^.Data:=X;
endelsebegin
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
Понял, спасибо!
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.