program list;
type
PElement = ^Element;
Element = record
data: integer;
prev: PElement;
next: PElement;
end;
procedure list_create(var head: PElement; data: integer);
begin
new(head);
head^.data := data;
head^.next := head;
head^.prev := head;
end;
procedure list_appbeg(var head: PElement; data: integer);
var
p: PElement;
begin
new(p);
p^.data := data;
head^.prev^.next := p;
p^.prev := head^.prev;
head^.prev := p;
p^.next := head;
head := p;
end;
procedure list_print(head: PElement);
var
p: PElement;
begin
p := head;
repeat
writeln(p^.data);
p := p^.next;
until p = head;
end;
procedure search_middle(var head: PElement; var i:integer);
var
p: PElement;
begin
p := head^.next;
i := 1;
while p <> head do
begin
p := p^.next;
i := i+1;
end;
i := i div 2 - 1;
end;
procedure add_in_middle(var head:PElement; i:integer);
var
p, k: PElement;
poz: integer;
begin
p:= head;
for poz:=1 to i do
p := p^.next;
new(k);
writeln('Input data of new element:');
read(k^.data);
p^.next^.prev := k;
k^.next := p^.next;
k^.prev:=p;
p^.next := k;
end;
procedure search_min(head:PElement; var min:PElement);
var
p:PElement;
begin
min:=head;
p:=head;
repeat
p:=p^.next;
if min^.data>p^.data then min:=p
until p=head
end;
procedure delete_min(var min:PElement);
begin
min^.next^.prev := min^.prev;
min^.prev^.next := min^.next;
dispose(min);
end;
var
head: PElement;
p: PElement;
min: PElement;
data: integer;
i, num: integer;
action: integer;
begin
writeln('Create list:');
write('Enter data of first element: ');
read(data);
list_create(head, data);
writeln('Input number of element, which You want to add: ');
read(num);
writeln('Input data: ');
for i:=1 to num do
begin
read(data);
list_appbeg(head, data);
end;
writeln('After adding in begin: ');
list_print(head);
writeln('Adding in middle: ');
search_middle(head, i);
add_in_middle(head, i);
writeln('After adding in middle: ');
list_print(head);
writeln('After deleting minimal element: ');
search_min(head,min);
delete_min(min);
list_print(head);
end.