- •Технология программирования (pascal)
- •V. Структуры и организация данных
- •2. Динамические структуры данных
- •2.2. Указатели и их использование для работы с динамическими переменными.
- •1. Проверка наличия требуемого объема памяти в heap-области.
- •2.3. Динамический массив.
- •2.4. Линейные связанные структуры.
- •2.5. Линейные списки.
- •1. Объявление (описание) данных односвязного списка:
- •2. Создание первого элемента списка и заполнение полей:
- •3. Создание следующего элемента и связывание его с первым элементом:
- •4. Создание списка из n элементов:
- •5. Удаление элемента списка:
- •1. Объявление данных двусвязного списка:
- •2. Пример программы работы с двусвязным списком.
-
2.4. Линейные связанные структуры.
К динамическим структурам относятся линейные связанные структуры, которые представляют собой последовательности с количеством элементов, как правило, большим нуля, и в которых должно соблюдаться условие: каждый элемент имеет не более одного предшествующего и одного последующего элемента. Порядок элементов в таких структурах задается не индексами элементов (как в массиве), а указателями, входящими в состав элементов структуры.
Удобным способом хранения динамических множеств являются списки.
Набор базисных операций над динамическими множествами:
-
создание пустого множества;
-
переход к первому, последнему, следующему или предыдущему элементу множества (этот элемент становится текущим) – получение доступа к k-му элементу множества;
-
извлечение значения текущего элемента – считывание значения;
-
замена значения текущего элемента;
-
добавление элемента в начало, в конец или перед/после текущего элемента – вставка нового элемента множества;
-
удаление k-го элемента множества;
-
объединение в одно множество двух или более подмножеств;
-
разбиение множества на два или более подмножеств;
-
создание копии множества;
-
определение количества элементов множества;
-
нахождение максимального и минимального элементов множества;
-
упорядочивание элементов множества;
-
поиск элемента множества с данным значением.
2.5. Линейные списки.
Наиболее простой способ связать некоторое множество элементов – это организовать линейный список, который представляет собой дискретную, связанную, динамическую, рекурсивную информационную структуру.
Особенности линейных списков:
-
списки состоят из элементов одного и того же типа;
-
cвязь между элементами и доступ к элементам списка осуществляется при помощи указателей, поэтому, кроме информационных данных, каждый элемент списка должен иметь указатели на последующий или/и предшествующий элемент списка;
-
количество элементов списка заранее не задаётся, оно может изменяться в процессе выполнения программы;
-
размер одного элемента списка не может превышать 64 Кбайт;
-
при описании списка используется рекурсия;
-
доступ к элементам списка последовательный.
Списки могут быть линейными (односвязными и двусвязными) и циклическими (кольцевыми), которые, в свою очередь, могут быть также односвязными или двусвязными.
Линейный односвязный (однонаправленный) список
В случае линейного односвязного списка любой элемент имеет один указатель, который указывает на следующий либо на предыдущий элемент в списке или является пустым указателем, что означает конец списка.
1. Объявление (описание) данных односвязного списка:
type
p_elem = ^element;
element = record
data: string[15];
next: p_elem;
end;
var
head, current, last : p_elem;
В данном случае элемент списка описан как запись, содержащая два поля data (для размещения данных) и next (типизированный указатель, который служит для организации списковой структуры).
В описании переменных описаны:
указатели head – указатель на заголовок списка,
current и last – указатели на текущий и последний элементы списка, позволяющие организовывать доступ к полям внутри элемента.