//Uzduotis: Sudaryti vienpusi saraa. Parayti paprograme, kuri i sarao paalina didiausia
program trecia;
type sarasas=^elem;
elem=record
inf:integer;
kitas:sarasas;
raktas:integer;
end;
//Saraso sukurimas--------------------------------------------------------------
procedure kurti_sarasa(var pradinis:sarasas; var count:integer);
var klaida,inf,ct:integer;
laikinas:sarasas;
input:string;
begin
ct:=0;
count:=0;
New(pradinis);
New(laikinas);
laikinas:=pradinis;
while input<>'s' do
begin
WriteLn('Iveskite ',count+1,'-aji saraso elementa, noredami nutraukti ivedima, rasykite ''s''');
ReadLn(input);
Val(input,inf,klaida);
if klaida=0 then
begin
if count>=1 then
begin
new(laikinas^.kitas);
laikinas:=laikinas^.kitas;
end;
laikinas^.inf:=inf;ct:=ct+1;
laikinas^.raktas:=ct;
count:=count+1;
end
else
if klaida=0 then WriteLn('Jus ivedete ne skaiciu, prasome ivesti skaiciu');
end;
end;
//------------------------------------------------------------------------------
//Saraso isvedimas--------------------------------------------------------------
procedure spausdinti(var pradinis:sarasas; count:integer);
var laikinas:sarasas;
i:integer;
begin
laikinas:=pradinis;
for i:=1 to count do
begin
WriteLn(i,'-as elementas ',laikinas^.inf);
laikinas:=laikinas^.kitas;
end;
end;
//------------------------------------------------------------------------------
//Didziausio elemento radimas---------------------------------------------------
procedure rasti_didziausia(var pradinis:sarasas; var count:integer; var didziausias:integer);
var i:integer;
laikinas:sarasas;
begin
New(laikinas);
laikinas:=pradinis;
didziausias:=1;
for i:=1 to count-1 do
begin
if laikinas^.inf<laikinas^.kitas^.inf then didziausias:=i+1;
laikinas:=laikinas^.kitas;
end;
end;
//------------------------------------------------------------------------------
//Elemento trynimas is saraso---------------------------------------------------
procedure trinti(var pradinis:sarasas; raktas:integer; var count:integer);
var i:integer; laikinas,po,pries:sarasas;
begin
New(laikinas);
New(po);
New(pries);
laikinas:=pradinis;
if raktas=1 then //bus du variantai: kai naikinamas 1as elementas, ir kai naikinami visi elementai
begin
for i:=2 to count do //ciklas skirtas eiles numeriams normalizuoti
begin
pradinis:=pradinis^.kitas; //iskart pereina prie antro nes pirma ir taip reikes trinti
pradinis^.raktas:=pradinis^.raktas-1;
end;
pradinis:=laikinas; //gryztama prie pirmo elemento kad butu galima ji istrinti
New(pradinis);
pradinis:=laikinas^.kitas; //dabar pirmas elementas yra buves antras elementas
end else //antars variantas:kai trinamas ne pirmas elementas
begin
for i:=1 to raktas-1 do // raktas-1 nes jei reiktu pirmo elemento tai nieko daryt nereiktu //surandamas tas elementas
begin
pries:=pradinis;
pradinis:=pradinis^.kitas;
end;
pries^.kitas:=pradinis^.kitas; //nurodo kad elementas esantis pries istrintaji elementa rodys i elementa esanti po istrintojo elemento
po:=pradinis; //nukopijuoja pradinis i po kad po galetu normalizuoti likusi sarasa, taip nepakeiciant pradinis kuris dar bus reikalingas dispousinant elementa, ir laikinas, kuris bus reikalingas grazinant sarasa i pradzia
for i:=raktas to count-1 do //normalizuoja
begin
po:=po^.kitas;
po^.raktas:=po^.raktas-1;
end;
Dispose(pradinis); //atlaisvina cele ir grazina pradinis i pradzia
New(pradinis);
pradinis:=laikinas;
end;
count:=count-1;
end;
//------------------------------------------------------------------------------
var pradinis:sarasas;
count, didz:integer;
begin
didz:=0;
writeln('Programa sarase suranda didziausia elementa ir ji pasalina.');
writeln('');
kurti_sarasa(pradinis,count);
writeln('');
writeln('Jusu ivestas sarasas:');
spausdinti(pradinis,count);
rasti_didziausia(pradinis,count,didz);
writeln('');
writeln('Didziausias yra ',didz,'-as elementas.');
writeln('Sarasas be didziausio nario:');
trinti(pradinis,didz,count);
spausdinti(pradinis,count);
Readln;
end.