Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
вот оно.docx
Скачиваний:
6
Добавлен:
25.09.2019
Размер:
1.75 Mб
Скачать

34 Двунаправленные списки

Двунаправленные списки, в отличие от однонаправленных, позволяют от

каждого звена двигаться по списку в любом направлении.

Каждое звено двунаправленного списка содержит два поля ссылочного типа. Значением одного поля является ссылка на последующее звено списка. Значением другого поля является ссылка на предыдущее звено списка. Структура звена двунаправленного списка определяется описанием типа,

приведенным в примере 7.8.

Схематично двунаправленный список с заглавным

рисунок 7.7. На данном рисунке элемент i представляет собой

информационную часть i-ого звена.

У заглавного звена списка нет предыдущего элемента. У последнего звена списка нет последующего элемента. Поэтому в поле Adrcled последнего звена и

в поле Adrpred заглавного звена двунаправленного списка должна быть пустая ссылка Nil.

На основе двунаправленного списка могут быть ораганизованы двунаправленные кольцевые списки. В кольцевом списке значением поля Adrcled последнего звена является ссылка на заглавное звено, значением поля Adrpred заглавного звена является ссылка на последнее звено (рисунок 7.8).

Данный рисунок отражает первый способ организации кольцевого

списка. При этом способе заглавное звено списка включается в кольцо. При втором способе способ организации кольцевого звено списка в кольцо не включается (рисунок 7.9).

Достоинство первого способа организации кольцевого списка – просто

реализуется вставка нового звена как в начало списка, так и в конец.

Недостаток – при циклической обработке элементов списка необходимо проверять, не является ли очередное звено заглавным звеном списка.

У второго способа организации кольцевого списка данный недостаток

отсутствует, но труднее реализовывается добавление звена в конец списка.

поиск элемента в списке;

вставка элемента в указанное место списка;

удаление из списка заданного элемента.

Для работы сдвунаправленными списками необходимо использовать два

указателя – на заглавное звено и на текущее звено.

36 Вставка элемента

Алгоритм вставки элемента в указанное место двунаправленного

кольцевого списка:

1 Порождение нового звена.

2 Занесение вставляемого элемента в инф поле порожденного звена.

3 Занесение в поле Adrcled порожденного звена ссылки на следующий

элемент из звена, предшествующего вставляемому.

4Занесение в поле Adrpred порожденного звена ссылки на предыдущий элемент из звена, следующего за вставляемым.

5Занесение в поле Adrpred следующего за вставляемым звена ссылки

на вставляемое звено.

6 Занесение в поле Adrcled предшествующего

звена ссылки на вставляемое звено

Действия, необходимые для вставки элемента в двунаправленный

кольцевой список с заглавным звеном, схематически поясняет рисунок

Пример 7.9.

Процедура вставки.

Procedure Vstav (Elem: <Тип_элемента_списка>; Predzv: Adr2);{Elem – вставляемый элемент, Predzv –ссылка на предшествующий элемент}

Var Q: Adr2; Begin

New (Q);

Q^.Element := Elem;

Q^.Adrcled := Predzv^.Adrcled; Q^.Adrpred := Predzv;

End

End.

Напомним, что список закольцовывается после добавления каждого нового звена.

Удаление элемента

Поиск элемента

Поиск элемента в двунаправленном кольцевом списке аналогичен поиску

элемента в цепочке (см. п. 7.1.3).Особенность поиска заключается в том, что в кольцевом списке формально нет последнего элемента, так как каждый лемент имеет ссылку на следующий. Это нужно учитывать при организации цикла поиска.