- •Понятие о структуре данного. Уровни представления структур данных.
- •Классификация сд в программах пользователя и в памяти эвм
- •Сд в оперативной памяти
- •Сд типа массив.
- •Сд типа запись (прямое декартово произведение).
- •Сд типа таблица.
- •Операции над таблицей:
- •Временная сложность алгоритмов.
- •Сд типа хеш-таблица.
- •Операция включения элемента в таблицу.
- •Операция исключения элемента из таблицы:
- •Сортировки. Улучшенные методы сортировок.
- •Классификация задач по временной сложности.
- •Сд типа стек.
- •Алгоритм сортировки Хоара (стек используется для хранения границ сортируемой области в таблице):
- •Сд типа очередь.
- •Связное распределение памяти.
- •Сд типа линейный односвязный список.
- •Сд типа указатель.
- •Статические и динамические переменные.
- •Сд типа циклический линейный список.
- •Сд типа двусвязный линейный список.
- •Сд типа дек.
- •Многосвязные списки.
- •Средства объектно-ориентированного программирования.
- •Объекты и свойства инкапсуляции.
- •Наследование и переопределение.
- •Полиморфизм. Виртуальные методы.
- •Динамические объекты. Деструкторы.
- •Обработка ошибок при работе с динамическими объектами.
- •Модули, экспортирующие объекты.
- •Нелинейные структуры данных.
- •Сд типа дерево.
- •Представление деревьев в связной памяти эвм.
- •Алгоритмы прохождения деревьев в глубину и в ширину.
- •Представление деревьев в виде бинарных.
- •Представление бинарных деревьев в связной памяти. Прошитые деревья
- •Формирование бинарного дерева.
- •Применение бинарных деревьев в алгоритмах поиска.
- •Операция включения в сд типа бинарное дерево.
- •Операция исключения из бинарного дерева.
- •Представление бинарного дерева в прямоугольной памяти.
- •Применение бинарных деревьев.
- •Сд типа граф.
- •Представление графа в памяти эвм.
- •Алгоритмы прохождения графа.
- •Топологическая сортировка.
- •Организация данных во внешней памяти. Типы и характеристики устройств внешней памяти.
- •Сд типа последовательный файл.
- •Сд типа файл прямого доступа.
- •Сд типа индексно-последовательный файл.
- •Сд типа хеш-файл.
- •Внешняя сортировка.
- •Алгоритм прямого слияния.
- •Многофазная сортировка.
- •Сущность базы данных. Системы управления базами данных.
- •Общая структура субд.
- •Реляционная модель субд.
- •Язык реляционной алгебры.
Сд типа указатель.
Указательный тип занимает промежуточное положение между скалярными и структурными типами: с одной стороны значение указательного типа является атомарным (неделимым), а с другой стороны, эти типы определяются через другие (в том числе и структурные) типы.
Type <тип указателя> = ^ <тип указываемого объекта>
(этот тип разрешает использовать базовый тип перед описанием)
Type PtrType = ^BaseType;
BaseType = record
x, y: real;
end;
Var A: PtrType; {А – переменная статического типа, значением которой являются адреса расположения в памяти конкретных значений заданного типа}
B: BaseType;
C: ^PtrType;
Переменной А можно присвоить адрес какой-либо переменной, для чего используем унарную операцию взятия указателя: А = @ В.
На физическом уровне указатель занимает два слова: в первом слове находится адрес сегмента, во втором – адрес смещения.
Операции над указательным типом:
Операция сравнения на равенство: = (равенство, если совпадают адреса сегмента и смещения).
Операция сравнения на неравенство: <>.
Операция доступа: B. x = B. X + 3. Доступ с помощью разыменования: A^. X=A^. X+3. Краткая операция разыменования: С^^. x.
Среди всех возможных указателей выделяется один специальный указатель, который никуда не указывает. Т.е. в памяти выделяется один адрес, в который не записывается ни одна переменная. На это место в памяти и ссылается такой пустой или “нулевой” указатель, который обозначается nil. Указатель nil считается константой, совместимой с любым ссылочным типом, т.е. это значение можно присваивать любому указательному типу.
Статические и динамические переменные.
До сих пор мы рассматривали переменные, которые размещаются в памяти согласно вполне определенным правилам, а именно, для локальных переменных, описанных в подпрограммах, память отводится при вызове подпрограммы; при выходе из нее эта память освобождается, а сами переменные прекращают существование. Глобальным переменным программы память отводится в начале ее выполнения; эти переменные существуют в течение всего периода работы программы. Иными словами, распределение памяти во всех этих случаях производится полностью автоматически и подчинено стековой дисциплине. Переменные, память под которые распределяется подобным образом, называются статическими.
Переменные, созданием и уничтожением которых может управлять программист, называются динамическими переменными. Они могут находиться в любой части динамической памяти, и обращение к ним может осуществляться только через указатель. Средством доступа к статическим переменным являются идентификаторы этих переменных. Динамические переменные, количество которых и место расположения в памяти заранее не известно, невозможно обозначить идентификаторами. Поэтому единственным средством доступа к динамическим переменным является указатель на место их текущего расположения в памяти.
Рассмотрим распределение памяти:
старший адрес
сегмент стека
FreePtr
динамическая память (куча)
HeapPtr
HeapOrg неподвижный
указатель
младший адрес
Под локальные переменные отводится специальный сегмент оперативной памяти (сегмент стека). Образование динамических переменных реализуется в другой области памяти, которая существует отдельно от стекового сегмента и называется кучей (heap) или динамической областью памяти.
Образование и уничтожение динамических переменных.
Основные действия над динамическими переменными – создание и уничтожение – реализуются стандартными процедурами New и Dispose.
New (<имя ссылки>): point; - процедура предназначена для создания динамических переменных определенного типа (другими словами, для отведения памяти в куче для хранения значений динамической переменной).
Dispose (<имя ссылки>): point; - процедура используется для освобождения памяти, отведенной с помощью процедуры New.
MaxAvail: longint; - функция возвращает максимальный размер (в байтах) непрерывного свободного участка кучи. Применение данной процедуры необходимо для контроля динамической памяти при реализации операции включения.
Например: if MaxAvail > SizeOf (BaseType) then {генерируем объект}
Создадим три объекта, которые расположатся в памяти последовательно (без фрагментарности), а затем уничтожим второй объект. В результате возникнет фрагментарность, которой нужно избегать.
Ptr 1 Ptr 2 Ptr 3
Ptr 1
Ptr 3
New (Ptr 1); New (Ptr 2); New (Ptr 3);
Dispose (Ptr 2)
Элемент свободного блока. Он записывается
в список свободных блоков.
MemAvail: longint; - функция возвращает общее количество свободной памяти.
Для того чтобы проверить, есть ли фрагментарность, надо сравнить результаты применения функций MaxAvail и MemAvail – они должны совпадать.