Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Lecture5_PAS.doc
Скачиваний:
22
Добавлен:
08.12.2018
Размер:
60.93 Кб
Скачать

Пример программы работы с двусвязным циклическим списком

Одна из возможных реализаций объекта для работы с двусвязным циклическим списком (создание и вывод списка, добавление элемента справа от текущего элемента, удаление элемента слева от текущего):

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 являются безадресными в том смысле, что для их выполнения никакой дополнительной информации о месте размещения элементов не требуется (для этого достаточно указателя стека).

Для работы со стеками на основе списка необходимо иметь указатель на вершину стека Тор и дополнительный (временный) указатель Р, который используется для выделения и освобождения памяти элементов списка.

Соседние файлы в предмете Программирование на Pascal