Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Itogovye_otvety_programmirovanie_1.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
202.75 Кб
Скачать

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);

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]