1))) создать в динамической памяти односвязный кольцевой список из 2n элементов (число n больше либо равно 1, задается пользователем) заполнение информационных полей элементов списка можно провестит генератором случайных чисел в диапозоне [0..100]. реализовать процедуры добавление элементов в любую точку списка, удаление любого члена из списка, вывод на экран полученной в куче числовой последовательности. 2))) из полученной динамической числовой пос-ти X1, X2, ...X2n вычислить: s={X1+Xn+1,X2+Xn+2,...Xn+X2n} запрещается использовать массивы. , т.е. нужно получить новую последовательность
которая в два раза меньше по длине!
program lab_12_dinamika_odnosvyaz_kolc;
uses crt;
type
point=^element;
element=record
Data:integer;
Next:point;
end;
var
P,H,PBegin : point;
i,n,Dlina : integer;
MemBegin : longint;
Simvol : char;
procedure Vivod(P:point);
var
First : pointer;
Dlina : integer;
begin
Dlina:=0;
First:=P;
writeln('Tekushaya posledivatelnost:');
while P^.Next <> First do begin
write(P^.data,' ');
P:=P^.Next;
inc(dlina);
end;
writeln;
writeln;
writeln('*Dlina posledovatelnisti=',dlina,'*');
writeln;
end;
procedure Vstavka(var P:point; Nomer,Chislo:integer);
var
i : integer;
N,Z : point;
begin
Z:=P;
if Nomer=1 then begin
New(N);
N^.Data:=Chislo;
N^.Next:=Z;
while Z^.Next <> P do Z:=Z^.Next;
Z^.Next:=N;
P:=N;
end
else begin
for i:=1 to Nomer-2 do begin
Z:=Z^.Next;
end;
writeln(Z^.Data);
New(N);
N^.Data:=Chislo;
N^.Next:=Z^.Next;
Z^.Next:=N;
end;
end;
procedure Udalenie( P:point; Nomer:integer);
var
i,Chislo : integer;
U,Z,First : point;
begin
Z:=P;
if Nomer=1 then begin
U:=Z;
First:=Z^.Next;
while Z^.Next <> PBegin do Z:=Z^.Next;
Z^.Next:=First;
Chislo:=U^.data;
Dispose(U);
PBegin:=First;
end
else begin
for i:=1 to Nomer-2 do begin
P:=P^.Next;
end;
U:=P^.Next;
P^.Next:=P^.Next^.Next;
Chislo:=U^.Data;
Dispose(U);
end;
end;
procedure NovPosl(var P:point); {неработающая процедура, зацикливается=(}
var
N,Z,T,Index : point;
X,Y:integer;
begin
Z:=P;
new(N);
PBegin:=N;
for i:=1 to (Dlina div 2) do begin {Dlina должна быть четная!!}
X:=Z^.data;
Index:=Z;
for i:=1 to (Dlina div 2) do Z:=Z^.Next;
Y:=Z^.Data;
N^.Data:=X+Y;
Z:=Index^.Next;
New(T);
N^.Next:=T;
T^.Next:=PBegin;
N:=T;
end;
P:=PBegin;
end;
begin {----------------------------}
clrscr;
randomize;
New(P);
PBegin:=P;
MemBegin:=MemAvail;
write('Vvedite kol-vo elementov: '); readln(N);
for i:=1 to 2*n do begin
P^.Data:=random(100);
New(H);
P^.Next:=H;
H^.Next:=PBegin;
P:=H;
end;
p:=PBegin;
Vivod(PBegin);
N:=0;
writeln;
writeln;
repeat begin
writeln('Najmit:');
writeln('D - udalit element');
writeln('A - dobavit element');
writeln('F - preobrazovanie');
writeln('E - vihod');
Simvol:=readkey;
case Simvol of
'd': begin
write('Vvedite poziciu elementa: ');
read(N);
P:=PBegin;
Udalenie(PBegin,N)
end;
'a': begin
write('Vvedite poziciu novogo elementa: ');
read(n);
Vstavka(PBegin,N,0)
end;
'f': begin
P:=PBegin;
NovPosl(P);
end;
end;
clrscr;
Vivod(PBegin);
end;
until Simvol='e';
end.
Заранее СПАСИБО!
