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

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

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

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

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

textual
Листинг программы
  1. const
  2.   count = 25;
  3.  
  4. type
  5.   tList = ^rList;
  6.   rList = record
  7.     N : Integer;
  8.     X : tList;
  9.   end;
  10.  
  11. function Create : tList;
  12. var
  13.   First, Cur : tList;
  14.   i : Integer;
  15. begin
  16.   New(First);
  17.   First^.N := Random(21)-10;
  18.   Cur := First;
  19.   for i := 2 to count do
  20.     begin
  21.       New(Cur^.X);
  22.       Cur := Cur^.X;
  23.       Cur^.N := Random(21)-10;
  24.     end;
  25.   Cur^.X := nil;
  26.   Create := First;
  27. end;
  28.  
  29. procedure See(List : tList);
  30. begin
  31.   while List <> nil do
  32.     begin
  33.       Write(#32, List^.N);
  34.       List := List^.X;
  35.     end;
  36.   WriteLn;
  37. end;
  38.  
  39. procedure MoveToBegin(var List : tList);
  40.  
  41.   function isolate(E : tList) : tList;
  42.   var
  43.     Cur : tList;
  44.   begin
  45.     if E = List then
  46.       List := List^.X
  47.     else
  48.       begin
  49.         Cur := List;
  50.         while Cur^.X <> E do
  51.           Cur := Cur^.X;
  52.         Cur^.X := E^.X;
  53.       end;
  54.     isolate := E;
  55.   end;
  56.  
  57.   procedure connect(var L, E : tList);
  58.   var
  59.     Cur : tList;
  60.   begin
  61.     if L = nil then
  62.       L := E
  63.     else
  64.       begin
  65.         Cur := L;
  66.         while Cur^.X <> nil do
  67.           Cur := Cur^.X;
  68.         Cur^.X := E;
  69.       end;
  70.   end;
  71.  
  72. var
  73.   Cur, Tmp, Negative, tmpNegative : tList;
  74. begin
  75.   Negative := nil;
  76.   Cur := List;
  77.   while Cur^.X <> nil do
  78.     if Cur^.N < 0 then
  79.       begin
  80.         Tmp := Cur;
  81.         Cur := Cur^.X;
  82.         tmpNegative := isolate(Tmp);
  83.         tmpNegative^.X := nil;
  84.         connect(Negative, tmpNegative);
  85.       end
  86.     else
  87.       Cur := Cur^.X;
  88.      
  89.   if Negative <> nil then
  90.     begin
  91.       Tmp := List;
  92.       List := Negative;
  93.       connect(List, Tmp);
  94.     end;
  95. end;
  96.  
  97. var
  98.   List : tList;
  99. begin
  100.   Randomize;
  101.   List := Create;
  102.   WriteLn('Список:'); See(List);
  103.   MoveToBegin(List);
  104.   WriteLn('Отрицательные в начале:'); See(List);
  105. 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

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы