Связанные динамические данные
Основные определения
Линейные списки - это данные динамической структуры, которые представляют собой совокупность линейно связанных однородных элементов и для которых разрешены следующие действия:
- добавление элемента в начало (голову) списка;
- вставка элемента между двумя любыми другими элементами списка;
- удаление любого, как крайнего, так и среднего, элемента списка.
Кольцевые списки - это такие же данные, как и линейные списки, но имеющие дополнительную связь между последним и первым элементом списка.
Очередь - частный случай линейного односвязного списка, для которого разрешены только два действия: добавление элемента в конец (хвост) очереди и удаление элемента из начала (головы) очереди.
Стек - частный случай линейного односвязного списка, для которого разрешено добавлять или удалять элементы только с одного конца списка, который называется вершиной (головой) стека.
Деревья - это динамические данные иерархической структуры произвольной конфигурации. Элементы дерева называются вершинами (узлами).
Пирамидой (упорядоченным деревом) называется дерево, в котором значения вершин (узлов) всегда возрастает или убывает при переходе на следующий уровень.
Организация взаимосвязей в связанных динамических данных
Связанные динамические данные характеризуются высокой гибкостью создания структур данных различной конфигурации. Это достигается благодаря возможности выделять и освобождать память под эти элементы в любой момент времени работы программы и возможности установить связь между любыми двумя элементами с помощью указателей.
Для организации связей между элементами динамической структуры данных требуется, чтобы каждый элемент содержал креме информационных значений как минимум один указатель. Отсюда следует, что в качестве элементов таких структур необходимо использовать записи, которые могут объединять в единое целое разнородные элементы.
В простейшем случае элемент динамической структуры данных должен состоять из двух полей: информационного и указательного.
Объявление будет иметь такой вид:
type
cptr=^zap;
zap=record
inf:integer;
link:cptr;
end;
Тип указателя на элемент динамической структуры данных может и должен быть описан перед описанием типа этого элемента.
Работа с очередью
Для создания очереди и работы с ней необходимо иметь как минимум два указателя:
- на начало очереди (возьмем идентификатор begp)
- на конец очереди (возьмем идентификатор тор)
Кроме того, для освобождения памяти удаляемых элементов требуется дополнительный временный указатель (возьмем идентификатор Р).
Создание очереди
1. Исходное состояние:
begp:=nil;
endp:=nil;
2. Выделение памяти под первый элемент очереди:
new(p);
3. Занесение информации в первый элемент очереди:
p^.inf:=x;
p^.link:=nil
4. Установка указателей begp и endp на созданный первый элемент:
begp:=p;
endp:=p;
Добавление элемента очереди
1. Исходное состояние.
2. Выделение памяти под новый элемент и занесение в него информации:
new(p);
p^.inf:=x;
p^.link:=nil;
3. Установка связи между последним элементом очереди и новым, а также перемещение указателя конца очереди endp на новый элемент:
endp^.link:=p;
endp:=p;
Удаление элемента очереди
1. Исходное состояние.
2. Извлечение информации из удаляемого элемента в переменную x и установка на него вспомогательного указателя Р:
x:=begp^.inf;
p:=begp;
3. Перестановка указателя начала очереди begp на следующий элемент, используя значение поля p^.link, которое хранится в первом элементе. После этого освобождается память начального элемента очереди, используя дополнительный указатель Р:
begp:=p^.link;
dispose(p);