uses crt;
type
ptr=^zap; {тип покажчик на запис}
zap=record
number:string; {елементданих}
next:ptr; {покажчик на наступний елемент}
end;
var first: ptr; {покажчик на початок списку }
ch: char; { вибiр режиму обробки списку}
newptr, {покажчик на введений елемент}
curr, {покажчик на наступний елемент}
prev: ptr; {покажчик на попереднiй елемент}
reg: string; {значення елемента даних }
done: boolean; {прапорець для пошуку мiсця вставки елемента}
{додавання елементiв до списку }
procedure insert;
begin
write('input elenent:');
readln(reg);
new(newptr); { видiленняпам'ятi пiдновийелемент}
newptr^.number:=reg; { ввiдданихвпам'ять}
if first=nil then { формування першого елемента списку}
begin
first:=newptr; {початковий покажчик на першому елементi}
first^.next:=nil; { покажчик на наступний елемент }
end
else {якщо список не порожнiй
перевiрка впорядкованостi списку}
if reg<=first^. number then {якщо нове значення менше iснуючого}
{вставка нового елемента на початку списку}
begin newptr^.next:=first;
first:=newptr;
end
else {якщоновезначеннябiльше iснуючих}
{пошукпотрiбногомiсцявставки }
begin
curr:=first; {покажчикпоточногоелементавказуєнаперший}
repeat
prev:=curr; {покажчик попереднього елемента вказує на
поточний елемент}
curr:=curr^.next; {покажчик поточного елемента вказує на
наступнийелемент}
if curr=nil
then done:=true
else done:=curr^.number>=reg;
until done; {переадресацiя пари покажчикiв до тих пiр, поки значення
даних, що введене, бiльше за тих, що є в списку: until curr^.number>=reg;}
{вставка нового елемента }
prev^.next:=newptr;
newptr^.next:=curr;
end
end; { кiнецьпроцедури insert}
{вилучення елемента iз списку, перший елемент вилучається останнiм}
procedure delete;
begin
if first=nil then {якщосписокпорожнiй}
begin
writeln('List is empty.Press ENTER...');
readln;
end
else {якщо список не порожнiй}
begin
write('input element:');
readln(reg); {ввiдзначення, щовилучається }
curr:= first;
if curr^.number=reg then {якщопотрiбнийелементзнайдений}
first:=curr^.next {вилученняелемента }
else
repeat {пошукпотрiбногоелемента }
prev:=curr; {перепризначенняпокажчикiв }
curr:=curr^.next; {покажчикнапопереднiйелементстає
поточним покажчиком, покажчик на
поточний елемент вказує на наступний}
until (curr^.number=reg) or (curr^.next=nil);
{вилучення знайденого елемента та звiльнення пам'ятi}
if curr^.number=reg then {якщо елемент списку спiвпадає з заданим}
begin
prev^.next:=curr^.next; {переадресацiя покажчикiв}
dispose(curr); end {звiльненняпам'ятi}
else
begin {якщо елемент не знайдено}
writeln(reg,' not found in list. Press ENTER...'); {вивiдповiдомлення}
readln;
end;
end;
end; { кiнецьпроцедури delete }
{ вивiдспискунаекран }
procedure outlist;
begin
curr:=first; {поточний покажчик вказує на перший}
if curr=nil then writeln('List is empty')
else begin
writeln(' output list:');
repeat
write(curr^.number,' '); {вивiдзначенняелемента }
curr:=curr^.next; {поточнимстаєпокажчикнанаступнийелемент} until curr=nil;
{вивiд значень, поки є елементи в списку}
end;
writeln;
end;
begin {**** головнапрограма ******}
first:=nil; {початок списку- список порожнiй }
repeat
clrscr; outlist; {очищення екрана, виведення списку}
writeln('I- input D- delete Q- quit');
write('input command:');
readln(ch);
ch:=upcase(ch);
case ch of
'I': Insert;
'D': delete;
end;
until ch='Q';
end.