Пример программы работы с двусвязным списком.
Программа выполняет следующие операции с элементами списка:
· добавление элемента в начало списка и вставка элемента после текущего;
· удаление текущего элемента;
· вывод списка.
В данном примере используется список с заголовочным элементом, т. е. специальным нулевым элементом, который не содержит данных. Такая организация списка используется для того, чтобы операции удаления и добавления элементов в начало списка производились так же, как в середину или в конец списка.
Program mod_list; { основная программа }
uses menu_proc;
begin
menu_work;
end.
Unit types; { модуль описания типов }
Interface { интерфейсная часть }
type
point=^element;
element=record
data:string[10];
last, next:point;
end;
Implementation { часть реализации в данном модуле пустая }
{ часть инициализации в данном модуле отсутствуют }
end.
Unit work_proc; { модуль процедур обработки линейного двусвязного списка }
Interface { интерфейсная часть }
uses types;
var
head: point;
pnt, pcur, p: point;
procedure current_elem(head: point, var pcur:point); { назначение элемента текущим }
|
|
procedure output_list(head:point); { вывод списка элементов }
procedure add_ins(var pcur:point); { добавление или вставка элемента после текущего }
procedure del_elem(head,pcur:point); { удаление текущего элемента }
procedure del_list(var head:point); { удаление списка }
Implementation { часть реализации }
procedure current_elem; { назначение текущего элемента }
var
s: string[10];
pr: boolean;
begin
readln(s);
p:=head;
pr:=false;
repeat
if p^.data=s then
begin
pcur:=p;
pr:=true;
end
else
p:=p^.next;
until (pr) or (p=nil);
end;
procedure output_list; { вывод списка элементов }
var
i: integer;
begin
p:=head;
i:=0;
repeat
if i=0 then
writeln('head')
else
writeln('(',i,') ',p^.data);
p:=p^.next;
i:=i+1;
until p=nil;
end;
procedure add_ins; { добавление или вставка элемента в список после назначенного текущего элемента }
begin
new(p);
readln(p^.data);
p^.last:=pcur;
p^.next:=pcur^.next;
pcur^.next:=p;
pnt:=p^.next;
if pnt<>nil then
pnt^.last:=p;
end;
procedure del_elem1(head:point, var pcur:point, var ppr: boolean); { вложенная процедура процедуры del_elem удаления текущего элемента }
begin
p:=head;
while (p^.next<>pcur) and (p^.next<>nil) do
p:=p^.next;
if p^.next=nil then
begin
pcur:=head;
ppr:=true;
end
else
begin
p^.next:=pcur^.next;
dispose(pcur);
if p^.next<>nil then
p^.next^.last:=p;
end;
end;
procedure del_elem; { удаление текущего элемента }
var
pr: boolean;
begin
if (pcur=head) and (head^.next=nil) then
begin
writeln('List is empty');
readln;
end
else
begin
pr:=false;
del_elem1(head,pcur,pr);
if pr then
begin
writeln('There is no such element of the list');
readln;
end;
end;
end;
procedure del_list; { удаление списка }
begin
repeat
p:=head;
head:=head^.next;
dispose(p);
until head=nil;
end;
{ часть инициализации в данном модуле отсутствует }
end.
Unit menu_proc; { модуль формирования меню }
Interface
uses crt, types, work_proc;
var
n: byte;
procedure menu_work;
Implementation
procedure menu_work;
begin
new(pcur);
head:=pcur;
pcur^.next:=nil;
pcur^.last:=nil;
repeat
clrscr;
writeln('1 - set current element');
writeln('2 - output list');
writeln('3 - add or insert element after current one');
writeln('4 - delete current element');
writeln('0 - exit');
readln(n);
|
|
clrscr;
case n of
1: begin
writeln('set current element: ');
current_elem(head,pcur);
end;
2: begin
output_list(head);
readln;
end;
3: begin
writeln('input element:');
add_ins(pcur);
end;
4: del_elem(head,pcur);
end;
until n=0;
del_list(head);
end;
end.