- •1.1. Основные этапы создания программы
- •1.2. Алгоритмы
- •2.1. Структура типов в Turbo Pascal
- •Стандартные скалярные типы. Типы целых чисел
- •2.3. Операции побитовой обработки
- •2.4. Представление вещественных чисел в эвм
- •2.5. Символьный тип
- •2.6. Булевский тип
- •2.7. Перечисленный тип
- •2.8. Интервальный тип (диапазон)
- •3.1. Структура программы на turbo pascal
- •3.2. Основные операторы языка
- •3.2.1. Простые операторы
- •3.2.2. Операторы ввода-вывода
- •3.2.3. Структурные операторы
- •3.2.4. Условные операторы
- •3.2.5. Операторы повтора (цикла)
- •4.1. Массивы
- •4.2. Строковый тип
- •4.3. Множества
- •5.1. Процедуры и функции
- •5.2. Процедуры и функции пользователя
- •5.3. Передача параметров по значению и по ссылке
- •5.4. Рекурсивные процедуры и функции
- •6.1. Структура модулей
- •6.2. Компиляция и использование модулей
- •7.1. Записи
- •7.2. Вложенные записи
- •7.3. Записи с вариантами (вариантные записи)
- •7.4. Файлы
- •7.5. Подпрограммы для работы с файлами
- •7.5.1. Процедуры
- •7.5.2. Функции
- •7.6. Примеры программ для обработки файлов
- •7.7. Текстовые файлы
- •8.1. Структура оперативной памяти для программ на Turbo Pascal
- •8.2. Динамические структуры данных
- •8.3. Основные процедуры и функции для работы с динамическими переменными
- •8.4. Динамика выделения памяти в куче
- •8.5. Линейные списки. Способы создания и обработки
- •8.6. Нелинейные списки. Способы создания и обработки
- •Библиографический список
- •Оглавление
- •394026 Воронеж, Московский просп., 14
8.2. Динамические структуры данных
Переменные, описанные в разделе описания переменных var, называются статическими переменными. Во время компиляции для каждого статического объекта в соответствии с его типом выделяется определенный объем памяти, который нельзя использовать для других целей до завершения работы программы. Количество объектов при работе с такими данными является постоянным во время всего жизненного цикла программы. Вместе с тем маловероятно, чтобы при всяком выполнении программы ей действительно были нужны все объекты одновременно. Решение проблемы экономного расходования памяти состоит в том, чтобы не резервировать максимальный объем памяти для размещения данных, а, предварительно определив тип данных, создавать новый экземпляр данных всякий раз, как только в нем возникает необходимость. Переменные, которые создаются и уничтожаются в процессе выполнения программы, называются динамическими.
Динамическое распределение памяти осуществляется посредством использования особого типа переменных – динамических переменных.
Динамическая переменная имеет, как правило, тип запись и содержит, по меньшей мере, два поля: информационное поле и поле ссылки.
В информационном поле помещается значение самой переменной, а в поле ссылки – адрес элемента, за которым будет следовать данная переменная.
{Тип ukaz ссылается (указывает) на переменную} {типа ctack}
type ukaz= ^ stack;
stack = record
inf: integer; {Информационное поле}
146
next: ukaz; {Поле ссылки}
end;
var r: ukaz;
Только при описании ссылочных переменных допускается использование идентификатора stack до его описания.
Пусть переменная r имеет тип ukaz. Тогда после обращения к процедуре new(r) будет создана указанная переменная, в которой предусмотрено информационное поле и поле ссылки. В информационном поле будет размещаться переменная заданного типа. В поле ссылки будет находиться адрес той переменной, за которой следует данная. Через r^ обозначается сама указанная переменная. Тогда r^.inf – соответствует информационному полю, а r^. next – полю ссылки.
Пусть имеется некоторая исходная ситуация:
1
147
2. w^: = r^. Одна указанная переменная присваивается другой. На место указанной переменной, указывающей на значение 40, заслана переменная, указывающая на значение 15.
3. w^. inf: = r^.inf. Информационное поле переменной w становится равным информационному полю переменной r.
4. w^. next: = r^. next. Поле ссылки переменной w становится равным полю ссылки переменной r.
148