type
PNode=^Node;{Указатель на узел}
Node=record {Структура узла}
chis,nom:integer; {число и порядковый номер числа в списке}
next:PNode; {Указатель на след}
end;
var
Head,p:PNode;
i,k,n:integer;
{Функция проверки есть ли такое число в списке}
function Search(Head1:PNode;k:integer):PNode;
var
tmp:PNode;
begin
tmp:=Head1; {Запоминаем адрес головы}
while ( tmp <> nil ) and (tmp^.chis <> k ) do {пока не дошли ло конца списка или не нашли такой элемент в списке}
tmp:=tmp^.next;
Search:=tmp; {Пзапомнили адрес элементаЖесли такое чсило есть уже в списке то будет возвращ его адрес если его нет то Search будет равно nil}
end;
{Проц доб в список, посмотрите в теме Динамические структ там всё подробно написанно}
procedure AddToList(var Head1:PNode;k,i:integer);
var
tmp:PNode;
begin
if Head1=nil then
begin
New(Head1);
tmp:=Head1;
end
else
begin
tmp:=Head1;
while tmp^.next <> nil do
tmp:=tmp^.next;
New(tmp^.next);
tmp:=tmp^.next;
end;
tmp^.next:=nil;
tmp^.chis:=k;
tmp^.nom:=i;
end;
{Проц посика мин и мас и суммы эл между ними}
procedure SearchMaxandMin(Head1:PNode);
var
tmp,pmin,pmax:PNode; {Вспомогательные переменные}
s:integer;
begin
pmin:=Head1; {Считаем что числа хран в голове списка мак и мин одновременно}
pmax:=Head1;
while Head1 <> nil do {Пока голова не равна пустотте делать}
begin
if Head1^.chis < pmin^.chis then {Сравнение}
pmin:=Head1;
if Head1^.chis > pmax^.chis then
pmax:=Head1;
Head1:=Head1^.next; {Пререход на след элемент}
end;
if pmin^.nom > pmax^.nom then {Смотрим мин элем предшествует макс}
writeln('Максимальный элемент предшествует минимальному!!!')
else {если нет то}
begin
tmp:=pmin; {нач установки}
s:=tmp^.chis;
while tmp <> pmax do {Пока не дошли да мак элемента делать}
begin
tmp:=tmp^.next;
s:=s+tmp^.chis; {Считаем сумму}
end;
writeln(pmin^.chis,' ',pmax^.chis);
writeln('Сумма ',s);
end;
end;
{Проц вывода списка на экран}
procedure Print(Head1:PNode);
begin
while Head1 <> nil do {Пока голова не станет равной пустоте делать}
begin
write(Head1^.chis:5);
Head1:=Head1^.next; {Преход на след элемент}
end;
end;
{процедура удаления списка}
Procedure FreeSpisok(var Head1:PNode);
var
tmp:PNode;
begin
while Head1<>nil do
begin
tmp:=Head1;
Head1:=Head1^.next; {Преставляем голову на след элемент за ней и }
FreeMem(tmp); {удаляем элем}
end;
end;
begin
Head:=nil;
writeln('Введите колво элементов');
readln(n);
Randomize;
k:=random(379)-126;
AddToList(Head,k,1);
for i:=2 to n do
repeat
k:=random(379)-126;
p:=Search(Head,k);
if p=nil then
AddToList(Head,k,i);
until p=nil;
Print(Head);
writeln;
SearchMaxandMin(Head);
FreeSpisok(Head);
end.