
- •1 Рекурсия
- •2 Рекурсия и Итерация
- •3 Линейный поиск
- •4 Поиск делением пополам (двоичный поиск)
- •5 Сортировка
- •6 Сортировка простыми включениями.
- •7 Сортировка бинарными включениями
- •8 Сортировка простым выбором.
- •9 Сортировка простым обменом (метод пузырька)
- •10 Шейкер сортировка.
- •11 Сортировка включениями с убывающими приращениями (сортировка Шелла).
- •12 Сортировка с разделением (быстрая сортировка).
- •13 Ссылочные типы.
- •14 Динамические структуры данных
- •15 Создание и уничтожение динамических переменных
- •16. Связанные списки
- •17. Связанные списки. Создание очередного элемента. Просмотр списка
- •18. Добавление компонент в середину списка
- •19. Исключение компонент из середины списка
- •20. Рекурсивная обработка списка
- •Вопрос 21
- •22 Деревья.
- •23 Двоичные деревья.
- •24 Двоичное дерево поиска.
- •25 Добавление узла к двоичному дереву.
- •26 Поиск в двоичном дереве.
- •28 Удаление из дерева.
- •29 Деревья общего вида.
- •30 Становление ооп
- •Абстрагирование
- •Иерархия
- •31 Основные концепции
- •2 Наследование
- •3 Индивидуальность объекта.(Про это у меня вообще ничего нет)
- •32 Абстрактные типы данных
- •37 Виртуальные методы.
- •38 Позднее связывание.
- •39 Полиморфизм
- •40 Расширенная совместимость типов.
- •42 Динамические объекты
- •45 Необходимость виртуальных методов.
14 Динамические структуры данных
Различают статистические и динамические переменные. Структурированные типы данных, такие, как массивы, множества, записи, представляют собой статические структуры, так как их размеры неизменны в течение всего времени выполнения программы. Часто требуется, чтобы структуры данных меняли свои размеры. Такие структуры данных называются динамическими. К динамическим структурам относятся списки (однаправленные, двунаправленные, кольцевые однаправленные и кольцевые двунаправленные), стеки, деки, очереди, деревья и другие.
Каждая динамическая структура данных характеризуется, во-первых, взаимосвязью элементов и, во-вторых, набором типовых операций над этой структурой. Как правило, такой набор в основном состоит из операций выборки, записи и поиска.
Для реализации некоторой динамической структуры на языке программирования Pascal необходимо:
отобразить ее на одну из структур языка программирования Pascal,
написать на Pascal процедуры выполнения типовых операций.
Заметим, что описание динамических структур с помощью массивов, записей и файлов приводит к неэкономному использованию памяти и увеличивает время решения задачи.
Каждую компоненту любой динамической структуры можно представить как запись, содержащую, по крайней мере, два поля: одно поле типа указатель на следующую компоненту, а второе поле - для размещения данных - принято называть информационным полем или полем данных. В общем случае запись может содержать не один, а несколько указателей и несколько полей данных. Поле данных может быть переменной любого простого типа, массивом, множеством или записью.
Для дальнейшего рассмотрения представим отдельную компоненту в виде:
Описание этой компоненты дадим следующим образом:
Type
PtrRec = ^Rec;
Rec = Record
Element : TypeElement;
pNext : PtrRec;
End;
Здесь TypeElement - тип данных, например, Integer, Char и другие.
С помощью списков могут моделироваться разнообразные динамические структуры, поддерживающие различные отношения порядка. В программировании широко используются такие структуры, как стек, очередь, дек - все они могут быть реализованы на списках.
Рассмотрим основные правила работы с динамическими структурами данных типа список, стек, дек, очередь, дерево, базируясь на приведенное описание компоненты.
15 Создание и уничтожение динамических переменных
- эти действия реализуются в Pascal стандартными процедурами New, Dispose. Процедура New – параметр ее переменная ссылочного типа. Действие процедуры:
1 В кучи отводится место для хранения переменной, тип которой совпадает с базовым типом указателя параметра.
2 Переменной переданной в параметре присваивается указатель на отведенную область в памяти.
Type point=record x,y: integer; color: byte;end; var pnt:^point; begin new(pnt); pnt.^.x:=xmouse; pnt.^.y:=ymouse; p^.color:=blue
В Pascal есть возможность представить процедуру New в форме функции. В этом случае в качестве «параметра» функции задается ссылочный тип, а результатом является указатель этого типа, ссылающийся на отведенную область для значения базового типа.
Type point=record x,y: integer; color: byte;end; pntptr:^point; var pnt:pntptr; begin new(pntptr);…
Переменной pnt присваивается адрес области памяти достаточный для хранения переменной базового типа (pntptr).
Для освобождения памяти, отведенной с помощью процедуры или функции New используется процедура dispose. Параметром является указатель на динамическую переменную. Var pnt:^point; begin new(pnt); …dispose(pnt)…end.
Существует важная проблема – возможное исчерпание динамической области. Для повышения надежности программы следует проверить текущее состояние динамической памяти при каждом обращении к процедуре new. Это можно сделать при помощи стандартной функции MaxAvail (возвращает максимальный размер свободного участка динамической памяти). Для определения необходимого размера воспользуемся функцией Size of.
Пример if MaxAvail>Size of (point) then pnt:=new(pntptr);
Существуют следующие процедуры GetMem(var p:pointer;Size:word); FreeMem(var p:pointer;Size:word);