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
write(p^.data,' ');
p := p^.next;
until p = head;
writeln(' ');
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 head:PElement; var min:PElement);
begin
if min = head then head:=head^.next;
min^.next^.prev := min^.prev;
min^.prev^.next := min^.next;
dispose(min);
end;
function count(head: PElement; var i:integer):integer;
var
p: PElement;
begin
p := head^.next;
i := 1;
while p <> head do
begin
p := p^.next;
i := i+1;
end;
count:=i;
end;
procedure edit_num(number:integer; var head:PElement; editElem:PElement);
var
i,max_num:integer;
k:PElement;
begin
max_num:=count(head,i);
read(editElem^.data);
k:=head;
if number>max_num then writeln('Element not found!') else
begin
if number=1 then head^.data:=editElem^.data
else
for i:=2 to number do k:= k^.next;
k^.data:=editElem^.data;
writeln('After editing element: ');
list_print(head);
end;
end;
var
head: PElement;
p: PElement;
min: PElement;
editElem: PElement;
data: integer;
i, num: integer;
action: integer;
number: integer;
begin
writeln('Create list:');
write('Enter data of first element: ');
read(data);
list_create(head, data);
repeat
writeln('--------------------------------');
writeln('Choose Action:');
writeln('1: Add n elements before head.');
writeln('2: Add one element in middle.');
writeln('3: Delete minimal element.');
writeln('4: Edit data of element.');
writeln('5: Exit.');
read(action);
if (action>5) or (action<1) then writeln('Warning!!! Input error!!!')
else
case action of
1:
begin
write('Input number of element, which You want to add: ');
read(num);
write('Input data: ');
for i:=1 to num do
begin
read(data);
list_appbeg(head, data);
end;
writeln('After adding in begin: ');
list_print(head);
end; {Add before head}
2:
begin
writeln('Adding in middle: ');
search_middle(head, i);
add_in_middle(head, i);
writeln('After adding in middle: ');
list_print(head);
end; {Add in middle}
3:
begin
writeln('After deleting minimal element: ');
search_min(head,min);
delete_min(head,min);
list_print(head);
end; {Delete min}
4:
begin
write('Input number of element which You want to edit: ');
read(number);
write('Input data of element which You want to edit: ');
edit_num(number,head,editElem);
end; {Edit element}
end;
until action=5
end.