- •Содержание
- •Раздел 1.Подпрограммы Общие сведения
- •Процедуры Описание процедур
- •Вызов процедур
- •Процедуры без параметров
- •Процедуры с параметрами
- •Параметры-значения
- •Параметры-переменные
- •Параметры-константы
- •Параметры-переменные без типа
- •Параметры процедурного типа
- •Использование производных типов в качестве параметров подпрограмм
- •Принцип локализации имен
- •Функции Описание функций
- •Вызов функции
- •Рекурсивные подпрограммы
- •Директивы
- •Библиотечные модули пользователя Общие сведения
- •Структура модуля Unit
- •Особенности работы с модулями
- •Подключение к программе внешнего файла
- •Раздел 2.Простейший ввод-вывод Процедуры ввода из стандартного текстового файла Input
- •248 15 4 70 Значения 1-й строки
- •11 Значения 2-й строки
- •Процедуры вывода в стандартный текстовый файл Output
- •Раздел 3.Записи Структура записи
- •Записи без вариантной части
- •Записи с вариантами
- •Оператор присоединения With
- •Константа-запись
- •Раздел 4.Множества Общие сведения
- •Конструктор множества
- •Задание множественного типа
- •Операции над множествами
- •Ввод / вывод значения множественной переменной
- •Типизованные константы-множества
- •Раздел 5.Файлы Общие сведения
- •Процедура Assign
- •Файлы с типом
- •Процедура Assign
- •Процедура Rewrite (f)
- •Процедура Write (f, v1 [, v2, … , vn])
- •Процедура Reset (f)
- •Процедура Read (f, V [, v2, …, vn])
- •Функция Eof(f)
- •Процедура Seek (f, n)
- •Функция Filepos (f)
- •Функция Filesize(f)
- •Процедура Close (f)
- •Текстовые файлы
- •Процедура Assign (f, Name)
- •Процедура AssignСrt(f)
- •Процедура Append (f)
- •Процедура Rewrite (f)
- •Процедура Reset (f)
- •Процедура Read ([f,] v1 [, v2, …, vn])
- •Процедура Readln [([f] [,] [v1, v2, …, vn])]
- •Процедура Write ([f,] e1 [, e2, …, en])
- •Процедура Writeln([f,][e1,e2, …,en])
- •Процедура Close(f)
- •Процедура SetTextBuf (f, Buf [, Size])
- •Процедура Flush (f)
- •Сравнительная характеристика представления информации в файлах с типом и текстовых файлах
- •I. Представление числовой информации.
- •II. Представление текстовой информации.
- •Файлы без типа
- •Процедуры Reset и Rewrite
- •Процедура Blockread
- •Процедура Blockwrite
- •Проверка операций ввода-вывода
- •Раздел 6.Ссылочный тип (тип указатель) Общие сведения
- •Методы работы с динамическими переменными
- •Процедуры New и Dispose
- •Процедуры Getmem и Freemem
- •Процедуры Mark и Release
- •Раздел 7.Динамические структуры данных Динамические цепочки Структура динамической цепочки
- •Формирование цепочки
- •Поиск элемента в цепочке
- •Удаление элемента из цепочки
- •Вставка элемента в цепочку
- •Линейный однонаправленный список
- •Двунаправленные списки
- •Вставка элемента
- •Создание двунаправленного кольцевого списка с заглавным звеном
- •Удаление элемента
- •Поиск элемента
- •Очереди и стеки
- •Очередь lifo
- •Очередь fifo
- •Общие сведения
- •Способы организации таблиц
- •Однонаправленный список.
- •Однонаправленный список с упорядоченными записями.
- •Однонаправленный список с отдельным хранением текста записи.
- •Представление в виде массива.
- •Двоичное дерево.
- •Двоичные деревья Структура двоичного дерева
- •Построение дерева
- •Поиск записи в дереве
- •Включение записи в дерево
- •Удаление записи из дерева
- •Раздел 8.Оверлеи Общие сведения
- •Правила оформления оверлейных программ
- •Инициализация работы оверлеев
- •Включение администратора оверлеев
- •Обработка ошибок администратора
- •Размещение оверлейного файла в ems-памяти
- •Управление оверлейным буфером
- •Литература Основная и дополнительная литература
- •Перечень наглядных пособий, методических указаний, методических материалов и используемых в учебном процессе технических средств
Раздел 7.Динамические структуры данных Динамические цепочки Структура динамической цепочки
Динамические цепочки являются аналогами строк текущей длины.
В строке каждый следующий элемент занимает ячейку памяти со следующим по порядку адресом.
Элементы строки можно размещать в памяти произвольно, если каждый элемент снабдить явным указанием места, где находится следующий за ним элемент. В этом случае каждый элемент строки должен состоять из двух полей: в одном поле (Element) – символ сроки, в другом (Adrcled) – ссылка на следующий элемент строки (адрес следующего элемента).
Каждая такая пара называется звеном. Ссылки сцепляют звенья в одну цепочку.
Такой способ представления упорядоченной последовательности элементов называется сцеплением. Сцепление применяется для представления любых сложных динамических структур данных – строк, списков, деревьев и так далее. В этом случае звено всегда состоит из двух частей – тела звена (элемента последовательности) и справочной части (ссылки на другие элементы структуры).
Таким образом, для представления звена необходимо использовать запись, состоящую из двух полей.
Пример 7.1.
Объявление звена цепочки.
Type
Adr = ^Zveno;
Zveno = Record
Element: Char;
Adrcled: Adr
End;
В примере 7.1 тип Adr представляет собой ссылки на программные элементы типа Zveno.
В данном примере имя типа Zveno используется до его описания при описании типа Adr (ссылочного типа). Ссылочный тип – единственный тип, где можно использовать имя до его описания. Обратную последовательность объявлений (вначале описать тип Zveno, а потом – тип Adr) в примере 7.1 использовать было бы нельзя (так как в типе Zveno используется неописанный тип Adr, а Zveno не является ссылочным типом).
Последнее звено цепочки должно быть снабжено ссылкой Nil (это признак конца цепочки).
Для работы с цепочкой необходимо использовать два указателя: ссылку на ее первое звено (Adr1) и ссылку на текущее звено (Adrzv). Ссылки должны иметь тип Adr. Например,
Var Adr1, Adrzv: Adr;
Схематично цепочка может быть представлена так, как изображает Рисунок 7 .56.
Рисунок 7.56 – Схематическое представление цепочки
Для удобства работы с цепочкой в нее обычно включается заглавное «нулевое» звено (хотя это и не обязательно). В поле Adrcled данного звена содержится ссылка на первое звено цепочки (его адрес). Поле Element может быть использовано для хранения какой-либо информации о строке.
Формирование цепочки
Пусть имеется объявление звена цепочки, соответствующее примеру 7.1.
Алгоритм формирования цепочки:
Отвести область памяти для очередного звена. Его адрес занести в поле Adrcled текущего звена.
Новое звено сделать текущим (занести его адрес в указатель текущего звена Adrzv).
В поле Element текущего звена занести очередной символ.
В поле Adrcled текущего звена занести Nil.
Прочитать следующий символ исходного текста.
Повторить этапы алгоритма, начиная с первого этапа.
Предварительно перед выполнением этапов 1 – 6 алгоритма необходимо сформировать заглавное звено.
Схематические пояснения к алгоритму формирования цепочки с заглавным звеном представляет Рисунок 7 .57.
На данном рисунке номерами в фигурных скобках представлены действия соответствующих этапов алгоритма.
Рисунок 7.57 - Схематические пояснения к алгоритму формирования цепочки
Пример 7.2.
Формирование цепочки. Ввод исходной строки и представление ее в виде цепочки. Признак окончания строки – точка. Раздел типов соответствует примеру 7.1.
…
Var
Adr1, Adrzv: Adr; {Adr1 – адрес заглавного звена,
Adrzv – адрес текущего звена}
Simv: Char;
Begin
{Формирование заглавного звена цепочки}
New (Adr1); {Отводится место в памяти для
заглавного звена цепочки}
Adrzv := Adr1; {Формируется адрес текущего звена}
Adrzv^.Adrcled := Nil; {При формировании цепочки текущее
звено всегда является последним,
поэтому адрес следующего звена – Nil}
Read (Simv); {Читается первая буква исходного текста}
{Формирование текущих звеньев цепочки}
While Simv <> ’.’ Do
Begin
{1} New (Adrzv^.Adrcled);
{2} Adrzv := Adrzv^.Adrcled;
{3} Adrzv^.Element := Simv;
{4} Adrzv^.Adrcled := Nil;
{5} Read (Simv);
End
…
Номера {1} – {5} операторов программы, приведенной в данном примере, соответствуют номерам этапов алгоритма формирования цепочки.
Над динамическими цепочками определены три операции:
поиск;
вставка;
удаление.