Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
090303 ТП Дин_стр спц.doc
Скачиваний:
1
Добавлен:
01.04.2025
Размер:
504.32 Кб
Скачать

Cвязанные динамические данные

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

Очередь — частный случай линейного односвязного списка, для которого разрешены только два действия: добавление элемента в конец (хвост) очереди и удаление элемента из начала (головы) очереди.

Стек — частный случай линейного односвязного списка, для кото­рого разрешено добавлять или удалять элементы только с одного конца списка, который называется вершиной (головой) стека.

Деревья — это динамические данные иерархической структуры произвольной конфигурации. Элементы дерева называются вершинами (узлами).

Организация взаимосвязей в связанных динамических данных

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

Для организации связей между элементами динамической структуры данных требуется, чтобы каждый элемент содержал кроме информационных значений как минимум один указатель. Отсюда следует, что в качестве элементов таких структур необходимо использовать записи, которые могут объединять в единое целое разнородные элементы.

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

Схематично такую структуру данных можно показать следующим образом:

Соответствующие ей объявления будут иметь такой вид:

Type

TPtr = ^TElem;

TElem = record

Inf : Real;

Link : TPtr

end;

Правило последовательности описаний в Turbo Pascal требует, чтобы каждый идентификатор был описан, прежде чем он будет использоваться для других объявлений. Однако в приведенном примере, как бы ни располагались описания типов указателя TPtr и элемента TElem, это правило выполнено не будет. Поэтому, для описания типов элементов динамических структур данных сделано исключение.

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

Работа с очередью

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

• на начало очереди (возьмем идентификатор BegQ);

• на конец очереди (возьмем идентификатор EndQ).

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

Создание очереди

1. Исходное состояние:

BegQ:= nil;

EndQ:= nil;

2. Выделение памяти под первый элемент очереди:

New(P);

3. Занесение информации в первый элемент

P^.Inf:=3;

P^.Link:=nil;

4. Установка указателей BegQ и EndQ на созданный первый элемент:

BegQ:=P;

EndQ:=P;

Добавление элементов очереди

1. Исходное состояние:

2. Выделение памяти под новый элемент и занесение в него информации:

New(p);

P^.Inf:=5;

P^.Link:=nil;

3. Установка связи между элементом очереди и новым, а также перемещение указателя конца очереди EndQ на новый элемент:

EndQ^.Link:=P;

EndQ:=P;

Удаление элемента очереди

1. Исходное состояние:

2. Извлечение информации из удаляемого элемента в переменную Val и установка на него вспомогательного указателя P:

Val:=BegQ^.Inf;

P:=BegQ;

3. Перестановка указателя начала очереди BegQ на следующий элемент, используя значение поля Link, которое хранится в первом элементе. После этого освобождается память начального элемента очереди, используя дополнительный указатель P:

BegQ:=P^.Link;

Dispose(P);

В качестве примера рассмотрим два задания на темы: сортировка элементов списка и операции работы с очередью.