- •Лекция №17. Динамические структуры данных. Очередь. Односвязный список
- •Очередь
- •1.Исходное состояние:
- •1. Исходное состояние:
- •Однонаправленные списки
- •1. Добавление звена в начало списка
- •2. Удаление звена из начала списка
- •3. Добавление звена в произвольное место списка, отличное от начала (после звена, указатель на которое задан)
- •4. Удаление звена из произвольного места списка, отличного от начала (после звена, указатель на которое задан)
Лекция №17. Динамические структуры данных. Очередь. Односвязный список
Очередь
Рассмотрим общую схему формирования очереди.
Для создания очереди и работы с ней необходимо иметь (как минимум) два указателя:
-на начало очереди (возьмем идентификатор ВеgUkaz),
-на конец очереди (возьмем идентификатор ЕndUkaz).
Для удобства работы часто используют временный (рабочий) указатель (возьмем р).
Правило очереди:
1) первым пришел – первым уйдешь.
2) движение лишь в одном направлении
начало конец
взять добавить
1.1. Создание очереди
Исходное состояние:
ВеgUkaz:=nil;
ЕndUkaz:=nil;
2. Выделение памяти под 1-й элемент очереди:
new(p);
начало
конец
1 элемент в очереди
3. Занесение информации в первый элемент очереди:
p^.inf:=3;
p^uk:=nil;
4. Установка указателя на 1-й элемент:
ВеgUkaz:=p;
EndUkaz:=p;
1.2. Добавление элемента в очередь
1.Исходное состояние:
ВеgUkaz EndUkaz
начало конец
новый
2. Выделение памяти под новый элемент и занесение информации в новый элемент:
new(p);
p^.inf:=10;
p^.uk:=nil;
ВеgUkaz EndUkaz p
3. Установка связи между последним элементом очереди и новым:
EndUkaz^.uk:=p;
ВеgUkaz EndUkaz p
4. Перемещение указателя конца очереди на новый элемент:
EndUk:=p;
ВеgUkaz EndUkaz p
1.3. Удаление элемента из очереди
1. Исходное состояние:
2. Установка на удаляемый элемент вспомогательного элемента р:
p:= ВеgUkaz;
3. Перестановка указателя начала очереди на следующий элемент, используя значение поля uk, которое хранится в первом элементе:
ВеgUkaz:=p^.uk;
4. Освобождение памяти начального элемента очереди, используя дополнительный указатель р:
dispose(p).
Задача.
Создать очередь из 10-ти вещественных чисел, вывести элементы на экран, предварительно их удалив.
program och;
type ukaz=^ochered;
ochered=record
inf:real;
uk:ukaz
end;
var BegUkaz, EndUkaz: ukaz;
i: byte;
ргосеdurе аdd(val: rеаl); {процедура создания и добавления
var p:ukaz; элемента в очередь}
begin
new(р);
р^.inf:= val;
р^.uk:= nil;
if EndUkaz=nil then BegUkaz:=p
else EndUkaz^.uk:=p;
EndUkaz:=p
end;
ргосеdurе del; {процедура удаления элемента из очереди }
var p:ukaz;
begin
p:= BegUkaz ;
BegUkaz:=p^.uk;
if BegUkaz=nil then EndUkaz:=nil; {если удаляется последний элемент}
EndUkaz:=nil;
dispose(p)
end;
begin
BegUkaz=nil; EndUkaz:=nil; {начальные установки}
for i:=1 to 10 do add(i); {создание очереди}
while BegUkaz<>nil do {вывод элементов и их удаление}
begin
writeln(‘значение=’, BegUkaz:=p^.uk;);
del;
end
end.