- •Содержание
- •Раздел 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-памяти
- •Управление оверлейным буфером
- •Литература Основная и дополнительная литература
- •Перечень наглядных пособий, методических указаний, методических материалов и используемых в учебном процессе технических средств
Поиск элемента в цепочке
При поиске элемента необходимо последовательно перебирать все звенья цепочки. Для перехода от одного звена к следующему нужно в цикле выполнять оператор присваивания
Adrzv:= Adrzv^.Adrcled,
то есть присваивать указателю текущего звена в качестве нового значения ссылку на следующее звено.
Данный оператор присваивания является аналогом оператора
I := I+1,
выполняемого для получения номера I следующего элемента при векторном представлении строки типа Array Of Char или String.
Пример 7.3.
Поиск элемента в строке-цепочке (в продолжение примеров 7.1, 7.2). Подсчет числа его вхождений в строку.
…
Var
K: Integer;
Bykva: Char;
Begin
…
Adrzv := Adr1; {Адресу текущего звена присваивается
значение адреса нулевого звена
(заглавного)}
K := 0; {Счетчик числа вхождений искомого
элемента}
Read (Bykva); {Чтение буквы, которую нужно найти}
While Adrzv^.Adrcled <> Nil Do {Пока не конец строки}
Begin
Adrzv := Adrzv^.Adrcled; {Указателю присваивается значение
адреса следующего звена}
If Adrzv^.Element = Bykva {Сравнивается содержимое поля элемента
текущего звена с заданной буквой}
Then K := K+1;
End;
…
Удаление элемента из цепочки
Исключаемый элемент наиболее удобно задавать при помощи ссылки на то звено, за которым следует этот элемент. При этом учитывается, что если какое-либо звено существует, но на него нет ссылки из другого звена, то оно недоступно при последовательном переборе звеньев цепочки. Поэтому это звено в цепочку не входит.
Например, в исходной цепочке (Рисунок 7 .58) необходимо удалить элемент 2. Для этого нужно, чтобы звено 1 ссылалось на звено 3 (Рисунок 7 .59).
Рисунок 7.58 – Фрагмент исходной цепочки
Рисунок 7.59 – Результат удаления элемента 2
Таким образом, для исключения элемента из цепочки необходимо изменить ссылку у предшествующего ему элемента. В качестве новой ссылки у этого элемента следует принять ссылку, содержащуюся в исключаемом элементе.
Пример 7.4.
Удаление из цепочки второго элемента (в продолжение примеров 7.1 – 7.3, см. Рисунок 7 .58, Рисунок 7 .59).
Для удаления необходимо использовать оператор
Adrzv^.Adrcled:=Adrzv^.Adrcled^.Adrcled
Поле адреса Поле адреса элемента 2
элемента 1 (исключаемого)
В этом случае в указателе текущего звена Adrzv должен находиться адрес элемента 1 (предшествующего исключаемому).
Пример 7.5.
Процедура удаления элемента из цепочки (в продолжение примеров 7.1 – 7.3).
Procedure Udal (Zv: Adr);
Var A: Adr; {A – вспомогательная переменная}
Begin
A := Zv^.Adrcled; {В А заносится адрес удаляемого
звена}
Zv^.Adrcled := Zv^.Adrcled^.Adrcled; {Удаление звена из цепочки}
{или равноценно Zv^.Adrcled := А^.Adrcled;}
Dispose (A) {Освобождение памяти, занимаемой
удаленным звеном}
End;
В данном примере в качестве параметра Zv процедуры должен передаваться адрес звена, предшествующего удаляемому.
В примере 7.4 удаление элемента из цепочки выполняется быстрее, но память расходуется неэффективно (так как отсутствует процедура Dispose).
В примере 7.5 удаление звена из цепочки прооисходит медленнее, но память расходуется эффективнее.
Тот или иной вариант удаления необходимо выбирать, исходя из конкретных требований к характеристикам программы.