Работа со списком - PascalABC.NET

Узнай цену своей работы

Формулировка задачи:

Дан список состоящий и последовательности a(1),a(2),...,a(n). Определить максимальное количество подряд идущих положительных элементов этого списка, не прерываемых нулями, отрицательными элементами. Вывести на экран указанную последовательность. Вот что получилось у меня, помогите доделать:

Решение задачи: «Работа со списком»

textual
Листинг программы
type
  nComponent = ^Component;
  Component = Record
    i: integer;
    pred, next: nComponent;
  end;
 
var
  head, tail: nComponent;
  i: integer;
 
procedure push_back(var head: nComponent; x: integer);
var
  i: nComponent;
begin
  if head = nil then begin
    new(head);
    head^.i := x;
  end
  else begin
    i := head;
    while i^.next <> nil do
      i := i^.next;
    new(i^.next);
    i^.next^.i := x;
    i^.next^.pred := i;
  end;
end;
 
procedure getList(head: nComponent; var tail: nComponent);
var
  i, maxi: nComponent;
  l, maxl: integer;
begin
  l := 0;
  maxl := 0;
  i := head;
  while head <> nil do begin
    if head^.i > 0 then inc(l)
    else begin
      if maxl < l then begin
        maxi := i;
        maxl := l;
      end;
      l := 0;
      i := head^.next;
    end;
    head := head^.next;
  end;
  for l := 1 to maxl do begin
    push_back(tail, maxi^.i);
    maxi := maxi^.next;
  end;
end;
 
procedure Write(head: nComponent);
begin
  while head <> nil do begin
    write(head^.i, ' ');
    head := head^.next;
  end;
  writeln;
end;
 
begin
  for i := 1 to 20 do
    push_back(head, random(-10, 10));
  Write(head);
  getList(head, tail);
  Write(tail);
end.

Объяснение кода листинга программы

В данном коде реализованы основные операции со связанным списком, а именно: добавление элемента в конец списка (метод push_back), получение списка (метод getList) и вывод списка на экран (метод Write).

  1. Структура связанного списка определена в типе nComponent и представляет собой вершину списка, содержащую ссылку на следующий элемент списка (next) и предыдущий элемент списка (pred).
  2. Переменные head и tail указывают на начало и конец списка соответственно.
  3. Метод push_back добавляет элемент x в конец списка. Если список пуст, то создается новый элемент и он становится началом списка. В противном случае ищется последний элемент списка (используя ссылку next), и новый элемент добавляется после него. При этом новый элемент содержит значение x, а ссылку на него (next) и ссылку на предыдущий элемент (pred) инициализируют соответственно.
  4. Метод getList проходит по всем элементам списка, начиная с головы, и суммирует положительные значения элементов. Если список пуст, то ничего не делает. Если в списке есть отрицательные значения, то считает количество таких значений и добавляет их в конец списка, начиная с нового элемента (с нулевым отрицательным значением).
  5. Метод Write выводит значения элементов списка, разделяя их пробелами.
  6. В основном блоке кода создается список из 20 случайных чисел от -10 до 10. Затем список выводится на экран, и вызывается метод getList, который получает список и добавляет в его конец отрицательные значения. После этого список снова выводится на экран.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

11   голосов , оценка 4.182 из 5
Похожие ответы