Для двусвязного списка (дека) реализовать подпрограммы - PascalABC.NET

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

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

Реализовать операции включения элемента слева, исключения справа. Для юнита.

Решение задачи: «Для двусвязного списка (дека) реализовать подпрограммы»

textual
Листинг программы
type
  rList = class
    V : Integer;
    head, tail : rList;
    
    constructor (V : Integer; head, tail : rList);
    begin
      Self.V := V;
      Self.head := head;
      Self.tail := tail;
    end;
  end;
  
type
  myList = class
    count : Integer;
    head, tail : rList;
    
    constructor;
    begin
      count := 0;
      head := nil;
      tail := nil;
    end;
    
    function Fill(count, minV, maxV : Integer) : myList;
    begin
      for var i := 1 to count do
        AddHead(Random(minV, maxV));
      Result := Self;
    end;
    
    function AddHead(V : Integer) : myList;
    begin
      head := New rList(V, nil, head);
      if head.tail <> nil then
        head.tail.head := head
      else
        tail := head;
      count += 1;
      Result := Self;
    end;
    
    function DeleteTail : myList;
    begin
      if head = tail then
        begin
          head := nil;
          tail := nil;
          count := 0;
        end
      else
        begin
          tail := tail.head;
          tail.tail := nil;
          count -= 1;
        end;
      Result := Self;
    end;
    
    function Print : myList;
    begin
      var tmp := head;
      if tmp = nil then
        Write('список пуст')
      else
        while tmp <> nil do
          begin
            Write(tmp.V, ' ');
            tmp := tmp.tail;
          end;
      Result := Self;
    end;
    
    function PrintLn : myList;
    begin
      Print; WriteLn;
      Result := Self;
    end;
  end;
 
begin
  Randomize;
  var L := New myList;
  L.Fill(10, 0, 100);
  Write('Создан список и заполнен случайными значениями: '); L.PrintLn;
  Write('       Добавление в начало списка значения 111: '); L.AddHead(111).PrintLn;
  WriteLn('Исключение элементов с конца списка, пока в нём есть значения:');
  while L.count > 0 do begin Write(L.count:2, ' : '); L.PrintLn.DeleteTail; end;
  L.PrintLn;
end.

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

  1. Создание классов rList и myList для двусвязного списка
  2. Задание значений переменным count, head, tail в классе myList
  3. Реализация функции Fill для заполнения списка значениями от minV до maxV
  4. Реализация функции AddHead для добавления элемента в начало списка
  5. Реализация функции DeleteTail для удаления элемента из конца списка
  6. Реализация функции Print для вывода значений списка на экран
  7. Реализация функции PrintLn для вывода значений списка на экран и перехода на новую строку
  8. Заполнение списка значениями от 0 до 100 с шагом 1
  9. Добавление элемента со значением 111 в начало списка
  10. Итерационное удаление элементов из конца списка, пока список не станет пустым
  11. Вывод списка на экран после удаления всех элементов

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

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