
- •1. Абстрагирование типов
- •1.1. Понятие типа данных
- •1.1.1. Простые типы
- •1.1.2. Абстрактные типы
- •2. Идентификация объектов
- •2.1. Именование
- •2.2. Указание
- •2.2.1. Организация адресного пространства оперативной
- •2.2.2. Понятие указателя
- •2.2.3. Действия над указателями
- •2.2.4. Связывание идентификатора объекта с его
- •3. Время жизни объекта. Классы памяти
- •3.1. Понятие “времени жизни” объекта
- •3.2. Классы памяти
- •3.2.1. Статическая память
- •3.2.2. Автоматическая память
- •3.2.3. Динамическая память
- •4. Динамические структуры данных
- •4.1. Метод вычисляемого и хранимого адреса.
- •4.2. Понятие динамической структуры данных
- •4.3. Линейные динамические структуры данных (списки)
- •4.3.1. Основные виды списков
- •4.4. Односвязные списки
- •4.4.1. Включение узла в начало списка
- •4.4.2. Создание списка из n узлов за счет добавления
- •4.4.3. Создание списка из n узлов за счет добавления
- •4.4.4. Исключение узла из начала списка
- •4.4.5. Перестановка указателя
- •4.4.6. Поиск в списке узла по заданному условию
- •4.4.7. Включение нового узла в список за тем узлом, на
- •4.4.8. Исключение из списка узла за тем узлом, на
- •4.4.9. Исключение из списка узла, на который предварительно
- •4.4.10. Разрушение списка
- •4.4.11. Программный модуль, реализующий операции
- •4.5. Односвязные циклические списки
- •4.6. Двусвязные списки
- •4.6.1. Включение нового узла в список за тем узлом, на
- •4.6.2. Исключение из списка узла, на который
- •4.7. Ортогональные списки (мультисписки)
- •4.8. Разнородные списки
- •4.9. Управление динамической памятью
- •4.9.1. Администратор кучи
- •4.9.2. Алгоритмы выделения участков памяти по запросу
- •4.9.3. Фрагментация
- •4.9.4. Накопление мусора
- •4.9.5. Висящие ссылки
- •5. Множественная интерпретация объектов
- •5.1. Совместимость типов. Приведение и преобразование типов
- •5.2. Методы совмещения типов
- •5.2.1. Запись с вариантной частью
- •5.2.2. Использование директивы absolute
- •5.2.3. Параметры без типа
- •5.2.4. Открытые массивы
- •5.2.5. Наложение масок с помощью указателей
- •6. Рекурсивные структуры данных
- •6.1. Итерация и рекурсия в программировании
- •6.1.1. Понятие рекурсии
- •6.1.2. Итеративная и рекурсивная схема организации
- •6.2. Задача о “ханойских башнях”
- •6.3. Виды рекурсивных структур данных
- •6.3.1. Арифметические выражения
- •6.3.2. Динамические линейные структуры данных: списки
- •6.3.3. Иерархические линейные структуры данных: наборы
- •6.4. Эффективность рекурсивных вычислений
- •7. ИерархическиеНелинейные структуры данных.Деревья
- •7.1. Деревья общего вида
- •7.2. Бинарные деревья
- •7.3. Представление бинарных деревьев
- •7.3.1. Представление бинарных деревьев на статической
- •7.3.2. Представление бинарных деревьев на
- •7.4. Алгоритмы обхода бинарных деревьев
- •7.5. Виды бинарных деревьев
- •7.5.1. Сбалансированные деревья
- •7.5.2. Дихотомические деревья (деревья поиска)
- •7.5.3. Деревья выражений
- •7.6. Программный модуль, реализующий операции
- •Список рекомендуемой литературы
6.3.3. Иерархические линейные структуры данных: наборы
Набор - это ортогональная структура иерархически определенных линейных списков. Набор - это линейная упорядоченная динамическая последовательность, каждый элемент которой является либо атомом, либо набором. Атом определяет “неделимый” элемент набора, предназначенный для хранения элементарной порции информации.
Пример структуры набора представлен на рис. 62:
Описание набора:
S{ 5 } = < 10, 20, R, 30, 40 >;
Эта запись означает, что набор, идентифицируемый указателем S, состоит из пяти элементов: атомов, содержащих значения 10 и 20, набора, идентифицируемого указателем R, и атомов, содержащих значения 30 и 40. Аналогично описаны наборы R и T.
R{ 3 } = < 50, T, 60 >;
T{ 3 } = < 75, 80, 90 >;
Рис. 62. Структура набора
Так как набор состоит из разнородных элементов, для реализации наборов используются разнородные списки. Головные элементы наборов одновременно участвуют в двух видах связей: они являются членами набора более высокого уровня (вертикальная связь в иерархии) и членами своего собственного набора (горизонтальная связь). Для того чтобы создать структуру набора, необходимо вначале определить наборы каждого уровня, состоящие только из атомов, а затем в соответствии с определенными условиями включить набор в качестве элемента в набор более высокого уровня.
Создать Т{ 3 } = < 75, 80, 90 >;
Создать R{ 2 } = < 50, 60 >;
Создать S{ 4 } = < 10, 20, 30, 40 >;
Первая директива означает, что необходимо создать набор, идентифицируемый указателем Т и состоящий из трех атомов со значениями 75, 80, 90. Остальные директивы определяются аналогично.
Включить Т в R{ 2 };
Включить R в S{ 3 };
Первая директива означает, что набор Т включается в набор R в качестве второго элемента. Вторая директива означает, что набор R включается в набор S в качестве третьего элемента. Результатом выполнения данных директив является структура набора, показанного на рис. 62.
Описание элемента хранения набора и процедура, распечатывающая значения атомов набора, приведены ниже.
Type |
| ||||
PNabor = ^ Nabor; |
{ тип – указатель на элемент хранения набора } | ||||
Nabor = record |
{ тип – элемент хранения набора } | ||||
right: PNabor; |
{ горизонтальная связь в наборе } | ||||
case t: boolean of |
{ признак типа элемента набора: } | ||||
true: ( under: PNabor ); |
{ набор – вертикальная связь в наборе } | ||||
false: ( zn: word ) |
{ атом – значение атома } | ||||
end; |
| ||||
Var Head: PNabor; |
| ||||
|
| ||||
Procedure Write_Nabor( p: PNabor ); |
{ p – указатель на головной элемент набора } | ||||
begin |
| ||||
if p <> nil then begin |
{ набор не пуст? } | ||||
if p^.t then Write_Nabor( p^.under ) |
{ элемент – набор: распечатать набор } | ||||
else writeln( p^.zn ); |
{ элемент – атом: распечатать значение атома} | ||||
Write_Nabor( p^.right ) |
{ распечатать следующий элемент набора } | ||||
end |
| ||||
end; |
|
Структура набора адекватна для отображения динамических вложенных понятий предметной области. Например, в ассоциацию (набор) “Акционеры” могут входить как отдельные частные лица (атомы), так и коллективы – организации, являющиеся ассоциациями собственных акционеров (наборы).