Умова задачі: Організувати список із операціями впорядкування елементів, вилучення елементів із списку, друкування списку.
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.