
- •Для студентов, обучающихся
- •Основные теоретические положения Действия с указателями
- •Некоторые свойства указателей.
- •Динамические данные
- •Cвязанные динамические данные
- •Организация взаимосвязей в связанных динамических данных
- •Создание очереди
- •Добавление элементов очереди
- •Пример 1. Надо упорядочить элементы списка по убыванию, используя сортировку посредством выбора максимального элемента. Используйте список без заглавного элемента. Решение:
- •Задание 2
- •Решение
- •Библиографический список
- •394000 Воронеж, пр. Революции, 19
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);
В качестве примера рассмотрим два задания на темы: сортировка элементов списка и операции работы с очередью.