- •Технология программирования (pascal)
- •V. Структуры и организация данных
- •2. Динамические структуры данных
- •2.5. Линейные списки.
- •1. Получение доступа к k-му элементу списка для считывания и/или изменения его значения:
- •2. Вставка нового элемента списка после k-го элемента:
- •3. Удаление k-го элемента списка:
- •2.6. Циклические (кольцевые) списки.
- •Пример программы работы с двусвязным циклическим списком
- •3. Организация данных
- •3.1. Организация данных – стек.
- •Основные операции над стеком и описательные алгоритмы реализации некоторых из них
- •1. Создание элемента стека:
- •2. Добавление элемента в стек:
- •3. Удаление элемента из стека:
- •1. Стек как механизм реализации вложенности.
- •Пример подпрограмм, реализующих стек
- •3.2. Организация данных – очередь. Простая очередь
- •Дек (двусторонняя очередь)
- •Очереди с ограниченным входом и с ограниченным выходом
Пример программы работы с двусвязным циклическим списком
Одна из возможных реализаций объекта для работы с двусвязным циклическим списком (создание и вывод списка, добавление элемента справа от текущего элемента, удаление элемента слева от текущего):
unit obj_type; { модуль описания объекта для обработки циклического двусвязного списка }
Interface
type
point=^element;
element= record
data: byte;
last, next: point;
end;
List= object
pcur: point;
procedure Init; { создание пустого списка }
procedure Create; { ввод данных и формирование списка }
procedure Current; { назначение текущего элемента }
procedure Output; { вывод списка }
procedure Add_right; { добавление элемента справа от текущего}
procedure Del_left; { удаление элемента слева от текущего }
end;
Implementation
procedure List.Init;
begin
pcur:= nil;
end;
procedure List.Create;
var
p, p1: point;
ans: char
begin
repeat
New( p);
writeln(‘ Данные: ’);
readln(p^. data);
if pcur<>nil then
begin
pcur^. next:= p;
p^. last:=pcur;
end
else
p1:=p;
pcur:= p;
writeln(‘ Продолжить ввод?(Д/Н) ’);
readln(ans);
until ans= ‘Н’;
pcur^. next:=p1;
p1^. last:=pcur;
end;
procedure List.Current;
var
p, pnt: point;
k: byte;
begin
clrscr;
writeln('Данные текущего элемента:');
readln(k);
p:=pcur;
pnt:=pcur;
repeat
if p^.data=k then
begin
pcur:=p;
break;
end;
p:=p^.next;
until p=pnt;
end;
procedure List.Output;
var
i: integer;
p: point;
begin
clrscr;
p:=pcur;
i:=1;
repeat
writeln(i,'-',p^ .data);
p:=p^. next;
i:=i+1;
until p=pcur;
readln;
end;
procedure List.Add_right;
var
p, pnt: point;
k: byte;
begin
clrscr;
writeln('Данные:');
readln(k);
New(p);
p^.data:=k;
p^.last:=pcur;
p^.next:=pcur^.next;
pnt:=pcur^.next;
pcur^.next:=p;
pnt^.last:=p;
end;
procedure List.Del_left;
var
p: point;
begin
if pcur^.next<>pcur then
begin
p:=pcur^.last;
pcur^.last:=p^.last;
p^.last^.next:=pcur;
Dispose(p);
end;
end;
end.
В данном случае указатель на первый элемент списка отсутствует. Для предотвращения зацикливания при обходе списка во время поиска указатель на текущий элемент предварительно копируется и служит ограничителем.
3. Организация данных
На основе массивов и списков можно смоделировать широко используемые в программировании организацию данных – стек и очередь, т. е. организацию хранения последовательности элементов (переменных), для которой задан определенный порядок их включения и исключения.
3.1. Организация данных – стек.
Стек представляет собой организацию данных, из которой первым извлекается тот элемент, который был добавлен в нее последним, т. е. последовательность элементов, включение и исключение элементов из которой производится только с одного конца, – таким образом, доступ к элементам происходит по принципу LIFO (last in first out).
Представление стека в виде списка.
Стек как организацию данных можно представить в виде линейного списка, для которого достаточно хранить указатель вершины стека, указывающий на первый элемент списка, т. е. на конец последовательности, в который производится добавление элементов и из которого производится их исключение. Начало последовательности называется дном стека.
Если стек пуст, то списка не существует, и указатель стека принимает значение nil.
Операция добавления нового элемента (запись в стек или включение элемента вершины стека) называется операцией проталкивания в стек и имеет общепринятое название Push.
Операция исключения элемента из вершины стека (удаление элемента) называется операцией выталкивания из стека и имеет общепринятое название Pop.
Операции Push и Pop являются безадресными в том смысле, что для их выполнения никакой дополнительной информации о месте размещения элементов не требуется (для этого достаточно указателя стека).
Для работы со стеками на основе списка необходимо иметь указатель на вершину стека Тор и дополнительный (временный) указатель Р, который используется для выделения и освобождения памяти элементов списка.