Перенести в начало списка все отрицательные элементы, вернуть количество переносов - Pascal

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

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

Дана, вот такая вот задачка: "«Перенести» в начало списка все отрицательные элементы, вернуть количество переносов." Односвязный список и все такое. Проблема в том, что я ни как не могу придумать алгоритм решения данной задачи.

Решение задачи: «Перенести в начало списка все отрицательные элементы, вернуть количество переносов»

textual
Листинг программы
const
  count = 25;
  
type
  tList = ^rList;
  rList = record
    N : Integer;
    X : tList;
  end;
  
function Create : tList;
var
  First, Cur : tList;
  i : Integer;
begin
  New(First);
  First^.N := Random(21)-10;
  Cur := First;
  for i := 2 to count do
    begin
      New(Cur^.X);
      Cur := Cur^.X;
      Cur^.N := Random(21)-10;
    end;
  Cur^.X := nil;
  Create := First;
end;
 
procedure See(List : tList);
begin
  while List <> nil do
    begin
      Write(#32, List^.N);
      List := List^.X;
    end;
  WriteLn;
end;
 
procedure MoveToBegin(var List : tList);
  
  function isolate(E : tList) : tList;
  var
    Cur : tList;
  begin
    if E = List then
      List := List^.X
    else
      begin
        Cur := List;
        while Cur^.X <> E do
          Cur := Cur^.X;
        Cur^.X := E^.X;
      end;
    isolate := E;
  end;
  
  procedure connect(var L, E : tList);
  var
    Cur : tList;
  begin
    if L = nil then
      L := E
    else
      begin
        Cur := L;
        while Cur^.X <> nil do
          Cur := Cur^.X;
        Cur^.X := E;
      end;
  end;
  
var
  Cur, Tmp, Negative, tmpNegative : tList;
begin
  Negative := nil;
  Cur := List;
  while Cur^.X <> nil do
    if Cur^.N < 0 then
      begin
        Tmp := Cur;
        Cur := Cur^.X;
        tmpNegative := isolate(Tmp);
        tmpNegative^.X := nil;
        connect(Negative, tmpNegative);
      end
    else
      Cur := Cur^.X;
      
  if Negative <> nil then
    begin
      Tmp := List;
      List := Negative;
      connect(List, Tmp);
    end;
end;
 
var
  List : tList;
begin
  Randomize;
  List := Create;
  WriteLn('Список:'); See(List);
  MoveToBegin(List);
  WriteLn('Отрицательные в начале:'); See(List);
end.

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

  1. Определение константы count со значением 25
  2. Определение типа tList как указателя на rList
  3. Определение структуры rList с полями N типа Integer и X типа указателя на tList
  4. Определение функции Create без параметров, которая возвращает указатель на tList
  5. Определение переменных First, Cur, i типа Integer
  6. Выделение памяти для First
  7. Присвоение случайного значения от -10 до 10 полю N структуры First
  8. Присвоение Cur значения First
  9. Цикл от 2 до count а. Выделение памяти для Cur^.X (следующего элемента списка) b. Переход к следующему элементу списка c. Присвоение случайного значения от -10 до 10 полю N структуры Cur^.X
  10. Присвоение Cur^.X значение nil (конец списка)
  11. Возврат значения First из функции Create
  12. Определение процедуры See с параметром List типа указателя на tList
  13. Цикл, пока List не равно nil а. Вывод значения List^.N (элемента списка) b. Переход к следующему элементу списка
  14. Вывод в консоль символа новой строки
  15. Определение процедуры MoveToBegin с параметром List типа указателя на tList
  16. Определение функции isolate с параметром E типа указателя на tList, возвращающую указатель на tList
  17. Определение процедуры connect с параметрами L и E типа указателя на tList
  18. Определение переменных Cur, Tmp, Negative, tmpNegative типа указателя на tList
  19. Присвоение Negative значения nil
  20. Присвоение Cur значения List
  21. Цикл, пока Cur^.X не равно nil а. Если значение поля N у текущего элемента списка меньше 0
    1. Присвоение Tmp значения Cur
    2. Переход к следующему элементу списка
    3. Присвоение tmpNegative значения isolate(Tmp)
    4. Присвоение поля X списка tmpNegative значения nil
    5. Вызов connect с параметрами Negative и tmpNegative b. Иначе
    6. Переход к следующему элементу списка
  22. Если Negative не равно nil а. Присвоение Tmp значения List b. Присвоение List значения Negative c. Вызов connect с параметрами List и Tmp
  23. Определение переменной List типа указателя на tList
  24. Генерация случайных чисел
  25. Присвоение List значения возвращаемого функцией Create
  26. Вывод текста Список: в консоль
  27. Вызов процедуры See с параметром List
  28. Вызов процедуры MoveToBegin с параметром List
  29. Вывод текста Отрицательные в начале: в консоль
  30. Вызов процедуры See с параметром List
  31. Конец программы

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


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

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

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