Составить программу заполняющую список последовательностью случайных различных чисел и суммирующую те его элементы, которые расположены между минимальным и максимальным элементом (если минимальный элемент предшествует максимальному) — Pascal(Паскаль)

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.

Leave a Comment

49 + = 59