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

32.Динамические цепочки. Объявление. Алгоритм формирования цепочки.

Динамические цепочки являются аналогами строк текущей длины.В строке каждый следующий элемент занимает ячейку памяти со следующим по порядку адресом.

Элементы строки можно размещать в памяти произвольно, если каждый элемент снабдить явным указанием места, где находится следующий за ним

элемент. В этом случае каждый элемент строки должен состоять из двух полей: в одном поле (Element) – символ сроки, в другом (Adrcled) – ссылка на следующий элемент строки (адрес следующего элемента).

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

Такой способ упорядочивания динам последовательности элементов называется сцеплением. Сцепление применяется для представления

любых сложных динамических структур данных – строк, списков, деревьев и так далее. В этом случае звено всегда состоит из двух частей – тела звена

(элемента последовательности) и справочной части (ссылки на другие элементы структуры). Таким образом, для представления звена необходимо использовать запись, состоящую из двух полей.

Пример 7.1.

Объявление звена цепочки.

Type

Adr = ^Zveno; Zveno = Record

Element: Char;

Adrcled: Adr

End;

В примере 7.1 тип Adr представляет собой ссылки на программные элементы типа Zveno. В данном примере имя типа Zveno используется до его описания при описании типа Adr (ссылочного типа). Ссылочный тип единственный тип, где можно использовать имя до его описания. Обратную последовательность объявлений (вначале описать тип Zveno, а потом – тип Adr) в примере 7.1 использовать было бы нельзя (так как в типе Zveno используется неописанный тип Adr, а Zveno не является ссылочным типом).

Последнее звено цепочки должно быть снабжено ссылкой Nil (это

признак конца цепочки). Для работы с цепочкой необходимо использовать два указателя: ссылку на ее первое звено (Adr1) и ссылку на текущее звено (Adrzv). Ссылки должны иметь тип Adr. Например, Var Adr1, Adrzv: Adr;

Формирование цепочки

Пусть имеется объявление звена цепочки, соответствующее примеру 7.1.

Алгоритм формирования цепочки:

1Отвести область памяти для очередного звена. Его адрес занести в поле Adrcled текущего звена.

2Новое звено сделать текущим (занести его адрес в указатель текущего звена Adrzv).

3В поле Element текущего звена занести очередной символ.

4В поле Adrcled текущего звена занести Nil. 5Прочитать следующий символ исходного текста. 6Повторить этапы алгоритма, начиная с первого этапа.

Предварительно перед выполнением этапов 1 – 6 алгоритма необходимо сформировать заглавное звено.

33 Поиск элемента в цепочке

При поиске элемента необходимо последовательно перебирать все звенья

цепочки. Для перехода от одного звена к следующему нужно в цикле выполнять оператор присваивания Adrzv:= Adrzv^.Adrcled, то есть присваивать указателю текущего звена в качестве нового значения

ссылку на следующее звено.

Данный оператор присваивания является аналогом оператора

I := I+1,

выполняемого для получения номера I следующего элемента при векторном

представлении строки типа Array Of Char или String.

Удаление элемента из цепочки

Исключаемый элемент наиболее удобно задавать при помощи ссылки на

то звено, за которым следует этот элемент. При этом учитывается, что если какое-либо звено существует, но на него нет ссылки из другого звена, то оно недоступно при последовательном переборе звеньев цепочки. Поэтому это звено в цепочку не входит. Например, в исходной цепочке (рисунок 7.3) необходимо удалить элемент 2. Для этого нужно, чтобы звено 1 ссылалось на звено 3 (рисунок 7.4).

Таким образом, для исключения элемента из цепочки необходимо изменить ссылку у предшествующего ему элемента. В качестве новой ссылки у этого элемента следует принять ссылку, содержащуюся в исключаемом элементе.

В данном примере в качестве параметра передаваться адрес звена, предшествующего удаляемому. В примере 7.4 удаление элемента из цепочки выполняется быстрее, память расходуется неэффективно (так как отсутствует процедура Dispose). В примере 7.5 удаление звена из цепочки прооисходит медленнее, память расходуется эффективнее. Тот или иной вариант удаления необходимо выбирать, исходя конкретных требований к характеристикам программы.

Вставка элемента в цепочку

Вставка элемента в цепочку основывается на объединении отдельных

звеньев в единую цепочку.Пусть в исходную цепочку (рисунок 7.5) после элемента 1 необходимо вставить элемент 4.

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

1 Создать новую динамическую переменную (запись типа Zveno),

которой будет представленно вставляемое звено.

2 В поле Elemen этой пременной занести вставляемый элемент (символ).

3 В поле Adrcled этой переменной занести ссылку, взятую из поля

Adrcled предшествующего звена.