Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лаб.Пух.1.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
178.69 Кб
Скачать

Глава 2. Задача 4

Кольцевой список из элементов с ключами.

Обозначения: D – данные, next – указатель на следующий элемент, P – указатель на предыдущий элемент, K – ключ, begin – указатель на начало списка.

2.1 Листинг программы

Program Kolzevoy_Spisok;

type

ptr=^R;

R=Record

A:real;

K:integer;

next:ptr;

end;

var

nach:ptr;

nb,a,i,n:integer;

inf:real;

Procedure Init(var nach:ptr);

begin

nach:=nil;

end;

Procedure Print_Spisok(nach:ptr);

var q:ptr; i:integer;

begin

writeln('spisok:');

writeln;

i:=0;

if nach<>nil then

begin

q:=nach;

repeat

i:=i+1;

writeln(i:3,' ',q^.A:8:2,' ',q^.K);

q:=q^.next;

until q=nach;

writeln;

end;

if (nach=nil) then writeln('spisok pust');

end;

Procedure Clear_Spisok(var nach:ptr);

var q,r:ptr;

begin

if nach<>nil then

begin

q:=nach;

repeat

r:=q;

q:=r^.next;

Dispose(r);

until q=nach;

end;

nach:=nil;

end;

Procedure Dobavit_nach(var nach:ptr; inf:real);

var q,r:ptr;

begin

New(q);

if nach=nil then begin

nach:=q;

q^.next:=nach;

end

else begin

r:=nach;

while r^.next<>nach do r:=r^.next;

q^.next:=nach;

nach:=q;

r^.next:=q;

end;

q^.A:=inf;

q^.K:=nb;

nb:=nb+1;

end;

Procedure Dobavit_kon(var nach:ptr; inf:real);

var q,r:ptr;

begin

New(q);

r:=nach;

if nach<>nil then while r^.next<>nach do r:=r^.next;

if nach=nil then begin

nach:=q;

q^.next:=nach;

end

else begin

r^.next:=q;

q^.next:=nach;

end;

q^.A:=inf;

q^.K:=nb;

nb:=nb+1;

end;

Procedure Dobavit_nom(var nach:ptr; a:integer; inf:real);

var q,r:ptr; i:integer;

begin

q:=nach; i:=1;

if a<>1 then repeat

i:=i+1;

q:=q^.next;

until (i=a) or (q=nach);

if (i<>a) then writeln('nevernyi nomer')

else begin

New(r);

r^.A:=inf;

r^.K:=nb;

nb:=nb+1;

r^.next:=q^.next;

q^.next:=r;

end;

end;

Procedure Dobavit_kl(var nach:ptr; a:integer; inf:real);

var q,r:ptr;

begin

q:=nach;

if q^.K<>a then repeat

q:=q^.next;

until (q^.K=a) or (q=nach);

if (q^.K<>a) then writeln('nevernyi kluch')

else begin

New(r);

r^.A:=inf;

r^.K:=nb;

nb:=nb+1;

r^.next:=q^.next;

q^.next:=r;

end;

end;

Procedure Udalit_nach(var nach:ptr);

var q,r:ptr;

begin

if nach<>nil then begin

if nach^.next<>nach then

begin

r:=nach;

while r^.next<>nach do r:=r^.next;

q:=nach;

nach:=q^.next;

r^.next:=nach;

Dispose(q);

end

else

begin

q:=nach;

nach:=nil;

Dispose(q);

end;

end;

end;

Procedure Udalit_kon(var nach:ptr);

var q,r:ptr;

begin

r:=nach;

if nach<>nil then

begin

if nach^.next=nach then

begin

q:=nach;

nach:=nil;

Dispose(q);

end

else

begin

while r^.next^.next<>nach do r:=r^.next;

q:=r^.next;

r^.next:=nach;

Dispose(q);

end;

end;

end;

Procedure Udalit_nom(var nach:ptr; a3:integer);

var q,r:ptr; i:integer;

begin

if a3=1 then

Udalit_nach(nach)

else

begin

r:=nach; i:=1;

while (i<>a3-1) do

begin

i:=i+1;

r:=r^.next;

end;

q:=r^.next;

r^.next:=q^.next;

Dispose(q);

end;

end;

Procedure Udalit_kl(var nach:ptr; a3:integer);

var q,r:ptr;

begin

r:=nach;

if r^.K=a3 then

Udalit_nach(nach)

else

begin

while (r^.next^.K<>a3) do

r:=r^.next;

q:=r^.next;

r^.next:=q^.next;

Dispose(q);

end;

end;

Procedure Dobav_Element(var nach:ptr);

var a2,a3:byte; i:integer;

b:boolean;

begin

repeat

writeln('1 - v nachalo');

writeln('2 - v konec');

writeln('3 - posle elementa');

writeln('4 - posle klucha');

readln(a2);

if (a2<>1) and (a2<>2) and (a2<>3) and (a2<>4) then b:=false else b:=true;

until b;

if a2=3 then

begin

write('nomer:');

readln(a3);

end;

if a2=4 then

begin

write('kluch:');

readln(a3);

end;

write('element:');

readln(inf);

if (a2=1) then

Dobavit_nach(nach,inf);

if (a2=2) then

Dobavit_kon(nach,inf);

if (a2=3) then

Dobavit_nom(nach,a3,inf);

if (a2=4) then

Dobavit_kl(nach,a3,inf);

end;

Procedure Udal_Element(var nach:ptr);

var a2,a3:byte; i:integer;

b:boolean;

begin

repeat

writeln('1 - iz nachala');

writeln('2 - iz konca');

writeln('3 - ukazannyi element');

writeln('4 - ukazannyi kluch');

readln(a2);

if (a2<>1) and (a2<>2) and (a2<>3) and (a2<>4) then b:=false else b:=true;

until b;

if a2=3 then

begin

write('nomer:');

readln(a3);

end;

if a2=4 then

begin

write('kluch:');

readln(a3);

end;

if (a2=1) then

Udalit_nach(nach);

if (a2=2) then

Udalit_kon(nach);

if (a2=3) then

Udalit_nom(nach,a3);

if (a2=4) then

Udalit_kl(nach,a3);

end;

begin

nb:=1;

Init(nach);

write('chislo dobavlennyh elementov spiska:');

readln(n);

for i:=1 to n do begin

Dobav_Element(nach);

Print_Spisok(nach);

readln;

end;

write('chislo udalennyh elementov spiska:');

readln(n);

for i:=1 to n do begin

Udal_Element(nach);

Print_Spisok(nach);

readln;

end;

Clear_Spisok(nach);

end.