Процедура создания стека Рассмотрим процедуру создания линейного однонаправленного стека в котором запоминается последовательность целых положительных чисел. При формировании стека используется два указателя: Zap 1 - указатель на первую запись списка и Zap. T - указатель на текущую запись списка. Очередной элемент добавляется в начало списка. Процедура возвращает указатель на первую запись списка Zap 1. После создания стека число записей в нем неизвестно.
procedure Stack( var Zap 1: Zap. Din); {создание стека на базе линейного списка} var N: integer; Zap. T: Zap. Din; begin Zap 1 : = NIL; {стек пуст} writeln('Введите целое положительное число'); read(N); while N > 0 do {цикл ввода и запоминания чисел в стеке } begin {выделение области памяти для хранения очередной записи - динамической переменной Zap. T^, которая содержит два поля : Исходные данные 1 2 3 0 Zap 1 N=1 NIL
Zap. T^. Ukaz - поле указателя и Zap. T^. Info - поле для целого числа} New(Zap. T); Zap. T^. Ukaz : = Zap 1; {занесение в поле указателя текущей записи адреса предыдущей записи, которая до настоящего момента была последней внесенной, т. е. первой в списке} Zap. T^. Info : = N; {занесение в запись введенного числа} {настройка указателя "начало" Zap 1 на новую запись} Zap 1 : = Zap. T; read(N); {ввод очередного числа} {формирование стека заканчивается при вводе целого отрицательного числа} end; zapt N=2 zapt 1 zap 1 2 zap 1 N=3 zapt N=0 3 zap 1 NIL
Рассмотрим процедуру создания связанного списка типа "очередь" для запоминания целых положительных чисел. В процедуре кроме указателей Zap 1 и Zap. T используется указатель Zap. P, который содержит адрес последней записи в списке.
procedure Ochered (var Zap 1: Zap. Din); {создание линейной очереди} Var N: integer; Zap. P, Zap. T: Zap. Din; begin writeln('Введите натуральные числа: '); read(N); {ввод первого числа} if N <= 0 then Zap 1 : = NIL {занесение признака пустой очереди} else begin New(Zap. T); {выделение памяти для первой записи} Zap 1 : = Zap. T; {запоминание адреса первой записи очереди} repeat{ цикл ввода и запоминания положительных чисел} 1. Первое введенной число отрицательное или 0. Создается пустой список NIL zap 1 1. Рассмотрим последовательность 1230 zap 1 zapt N=1
Задача 1. Удаление из списка нечетных элементов без использования нового списка. Используется два указателя: • Curr – на текущий элемент списка • pred - на предшествующий ему. zap 1 1 1. 2. 3. 8 pred curr 3 6 pred curr 8 9 NIL curr pred 2 NIL Начало списка Середина Последний элемент Исходное положение указателей изображено черным цветом, после удаления – синим.
Задача 2. Вставить до максимального элемента списка число 100, а после него - число 1000. При решении задачи используются указатели • zapt - указатель на текущий элемент списка; • zapp - на предыдущий; • zapmax - указатель на max элемент; • predmax - на элемент, расположенный перед максимальным. Zap 100 Zap 1 100 2 zap 1000 7 8. zap 1 3 1 NIL predmax NIL zap 100