- •25. Процедуры, управляющие работой буфера ввода-вывода для текстовых файлов.
- •10) Процедура Close(f)
- •11) Процедура SetTextBuf (f, Buf [, Size])
- •26 Сравнительная характеристика внутренней структуры представления информации в текстовом файле и файле с типом. Достоинства и недостатки использования текстового файла и файла с типом.
- •I. Представление числовой информации.
- •II. Представление текстовой информации.
- •1) Процедуры Reset и Rewrite
- •2) Процедура Blockread
- •3) Процедура Blockwrite
- •28 Проверка операций ввода-вывода
- •29 Ссылочный тип. Назначение. Синтаксис задания. Представление в памяти. Виды указателей. Операции над указателями.Общие сведения
- •32.Динамические цепочки. Объявление. Алгоритм формирования цепочки.
- •34 Двунаправленные списки
- •38 Очередь lifo
- •39 Очередь fifo
- •40Таблицы
- •42Поиск записи в дереве
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).Особенность поиска заключается в том, что в кольцевом списке формально нет последнего элемента, так как каждый лемент имеет ссылку на следующий. Это нужно учитывать при организации цикла поиска.