Вводится неопределённое количество чисел и из них формируется список. Нужно создать второй список, который состоит из разностей соседних чисел — Pascal(Паскаль)

program Project1;
 
type
  (*Тип, описывающий элемент списка.*)
  TPElem = ^TElem;
  TElem = record
    Data : Integer;
    PNext : TPElem;
  end;
  (*Тип, описывающий список.*)
  TList = record
    PFirst : TPElem;
    PLast : TPElem;
  end;
 
(*Процедуры для работы со списком.*)
 
(*Удаление всего списка из памяти и инициализация.*)
procedure ListFree(var aList : TList);
var
  PNext, PDel : TPElem;
begin
  if aList.PFirst = nil then Exit;
 
  PNext := aList.PFirst;
  while PNext <> nil do begin
    PDel := PNext;
    PNext := PNext^.PNext;
    Dispose(PDel);
  end;
 
  aList.PFirst := nil;
  aList.PLast := nil;
end;
 
(*Добавление элемента в конец списка.*)
procedure ListAdd(var aList : TList; const aPElem : TPElem);
begin
  if aPElem = nil then Exit;
 
  aPElem^.PNext := nil;
  if aList.PFirst = nil then begin
    aList.PFirst := aPElem;
    aList.PLast := aPElem;
  end else begin
    aList.PLast^.PNext := aPElem;
    aList.PLast := aPElem;
  end;
end;
 
var
  S : String;
  i, Num, Code : Integer;
  PElem, PNext : TPElem;
  List1, List2 : TList;
begin
  (*Инициализация списков.*)
  ListFree(List1);
  ListFree(List2);
 
  repeat
    (*Ввод элементов первого списка.*)
    Writeln('Введите целые числа в первый список.');
    Writeln('Для прекращения ввода введите знак отличный от: [''-'', ''+'', ''0''..''9''].');
    repeat
      Readln(S);
      Val(S, Num, Code);
      if Code = 0 then begin
        New(PElem);
        PElem^.Data := Num;
        ListAdd(List1, PElem);
      end;
    until Code <> 0;
 
    (*Перебор элементов первого списка и составление второго списка.*)
    PNext := List1.PFirst;
    i := 0;
    Num := 0;
    while PNext <> nil do begin
      Inc(i);
      if i mod 2 <> 0 then begin
        Num := PNext^.Data;
      end else begin
        New(PElem);
        PElem^.Data := Num - PNext^.Data;
        ListAdd(List2, PElem);
        Num := 0;
      end;
      PNext := PNext^.PNext;
    end;
 
    (*Показываем на экране элементы второго списка.*)
    Writeln('Элементы второго списка:');
    PNext := List2.PFirst;
    i := 0;
    while PNext <> nil do begin
      Inc(i);
      if i > 1 then Write(', ');
      Write(PNext^.Data);
      PNext := PNext^.PNext;
    end;
    if i = 0 then Write('Второй список пуст.');
    Writeln;
 
    (*Удаление списков из памяти.*)
    ListFree(List1);
    ListFree(List2);
 
    Writeln('Повторить - Enter. Выход - любой символ + Enter.');
    Readln(S);
  until S <> '';
end.

Leave a Comment

4 + 5 =