- •Содержание
- •Раздел 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.22.
Пример 7.23.
Логическая функция, отыскивающая вершину дерева с заданным ключом. Формальные параметры: К - заданный ключ, D - ссылка на корень дерева, в котором ведется поиск, Rez- переменная, которой присваивается ссылка на найденное звено в случае успешного поиска (такая вершина есть), или ссылка на вершину, после обработки которой поиск прекращен, в случае неуспешного поиска (закончилась ветвь).
Function Poisk (K: Integer; Var D, Rez: Adrzv): Boolean;
Var
P, Q: Adrzv;
B: Boolean; {В – признак того, что ключ найден}
Begin
B := False;
P := D; {В Р заносится адрес корня дерева, затем
в Р будет храниться адрес вершины,
подлежащей обработке}
Q := Nil;
If D <> Nil Then {Анализ, не является ли дерево пустым}
Repeat
Q := P; {В Q будет храниться адрес
обработанной вершины}
If P^.Kl = K Then
B := True {Найдена нужная вершина}
Else
If K < P^.Kl Then
P := P^.Lev
Else
P := P^.Prav
Until B Or (P = Nil); {Поиск, пока не найден ключ (В=True)
или пока не закончилась
соответствующая ветвь}
Poisk := B; {Возвращаемое значение}
Rez := Q; {В Q – адрес звена с нужным ключом
или адрес конца ветви}
End;
Скорость поиска в двоичном дереве примерно равна скорости дихотомического поиска (см. пример 7.20).
Включение записи в дерево
Для включения записи в дерево нужно найти в нем вершину, к которой можно присоединить новую вершину, соответствующую включаемой записи. Алгоритм поиска нужной вершины аналогичен алгоритму поиска вершины с заданным ключом (см. пример 7.23). Нужная вершина найдена, если в качестве очередной ссылки, определяющей ветвь продолжения поиска, окажется ссылка Nil.
Таким образом, для поиска вершины, к которой можно присоединить включаемую запись, можно воспользоваться алгоритмом поиска вершины с заданным ключом, реализованным в примере 7.23. Такая вершина найдена, если В = False. В этом случае в Rez находится адрес вершины, к которой можно подсоединить включаемую вершину.
Для простоты будем считать, что в таблице нет записи с тем же ключом, что и у включаемой записи.
Пусть имеется объявление по примеру 7.22.
Пример 7.24.
Процедура включения записи в дерево. Параметры процедуры: К - ключ, D - адрес корня дерева, Zap - текст вставляемой записи.
Procedure Vkl (K: Integer; Var D: Adrzv; Zap: Tekst);
Var
Q, S: Adrzv;
T: Adrt;
Begin
If Not Poisk (K, D, Q) Then
Begin
New (T); {Создано звено для занесения текста записи}
T^ := Zap; {Занесен в таблицу текст записи}
New (S); {Сформирована новая вершина в дереве}
S^.Kl := K; {Занесен ключ в поле Kl новой вершины}
S^.Adr := T; {Занесен адрес текста записи в поле Adr новой
вершины}
S^.Lev := Nil;
S^.Prav := Nil; {Созданная вершина сделана “листом” дерева}
If D = Nil Then
D := S {Если дерево еще пусто (создается), то
созданное звено делается корнем дерева}
Else
If K < Q^.Kl {В Q-адрес вершины, к которой
присоединяется новая вершина}
Then
Q^.Lev := S
Else
Q^.Prav := S
End
End;