bar2104

Списки

Apr 13th, 2020
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 5.77 KB | None | 0 0
  1. program Hello; // Pascal [fpc 3.0.4]
  2. type
  3.     BT = LongInt; // Тип информации, которую собираемся сохранять
  4.     u = ^Zveno;   //Указатель на запись
  5.     //Структура
  6.     Zveno = record
  7.         inf : BT; //Информация
  8.         next : u ; // Следующий элемент записи
  9.     end;
  10.  
  11. {***************************************************}
  12. //Процедура добавляет запись с значением X в начало списка
  13. procedure v_nachalo(var First:u;x:BT);
  14. var
  15.     VSP : u; //Указатель на вспомогательный элемент списка
  16. begin
  17.     New(vsp); //выделяем память на новый элемент
  18.     vsp^.inf :=x; //Вставляем значения
  19.     vsp^.Next:=First; // Вставляем ссылку на следующий элемент(который до этого был первым)
  20.     First:=VSP;// Переназначаем первый элемент списка
  21. end;
  22.  
  23. {***************************************************}
  24. //Процедура удаляет элемент списка из начала
  25. Procedure IZ_nachala(var First:u; var x:BT);
  26. var VSP:U; //Указатель на вспомогательный элемент списка
  27. begin
  28.     vsp:=First; // Теперь VSP - ссылка на первый элемент
  29.     First:=First^.Next; // Достаем адрес второго элемента, теперь второй элемент стал первым
  30.     x:=VSP^.Inf; // На всякий случай получаем значение удаляемого элемента
  31.     Dispose(VSP); // Удаляем
  32. end;
  33.  
  34. {***************************************************}
  35. // Вставляем новый элемент после определенного элемента
  36. Procedure V_Spisok(Pred:U; x:BT);
  37. var vsp:u; // Указатель на временный элемент
  38. begin
  39.     New(VSP); // СОздаем новый элемент
  40.     Vsp^.Inf:=x; //Помещаем в него значение
  41.     Vsp^.Next := Pred^.Next; //Вставляем ссылку на следующий элемент(на место которого вставляем)
  42.     pred^.Next:=Vsp; // В предыдущий вставляем ссылку на вновь созданный
  43. end;
  44.  
  45. {***************************************************}
  46. // Удаляем Из списка элемент после указанного( следующий за pred)
  47. Procedure iz_spiska(pred:u; var x: bt);
  48. var vsp:u; // Указатель на временный элемент
  49. begin
  50.     vsp := Pred^.Next; // Указатель на удаляемый элемент
  51.     pred^.next := Pred^.next^.next; // В предыдущем меняем ссылку "перескакивая" через тот, что удаляем
  52.     x:=vsp^.inf; // На всякий случай получаем значение удаляемого элемента
  53.     dispose(vsp); // Удаляем
  54. end;
  55.  
  56. {***************************************************}
  57. //Возвращает true Если список пустой(первый элемент пустой)
  58. //Вспомогательная
  59. function Pust(first:u): Boolean;
  60. begin
  61.     Pust := first = nil;
  62. end;
  63.  
  64. {***************************************************}
  65. // Процедура отчистки списка
  66. procedure ochistka(First:u);
  67. var vsp:bt; // Вспомогательная
  68. begin
  69.     while not Pust(First) do //Пока список не пустой
  70.         iz_nachala(First,vsp); //Удаляем первый элемент
  71. end;
  72.  
  73. {***************************************************}
  74. //Выводим список
  75. procedure Print(First:u);
  76. var Vsp:U; // Временный указатель на элемент списка
  77. begin
  78.     vsp:=first; // Начинаем с первого списка
  79.     while vsp <> Nil do // Пока существует элемент списка
  80.     begin
  81.         write(vsp^.inf:6); // Вывести значение
  82.         vsp:=vsp^.next; //Кладем в VSP ссылку на следующий элемент
  83.     end;
  84.     writeln;
  85. end;
  86.  
  87. {*************ПЕРЕМЕННЫЕ**************************}
  88. Var
  89.     S1, S2, S3, V1, V2, V3 : U; //S - start; V - now
  90.     A : BT; //information
  91.     I, N : Byte;
  92. Begin
  93.     Randomize;
  94.     N := 1 + Random(20);
  95.     S1 := Nil;
  96.     A := -100 + Random(201);
  97.     V_Nachalo(S1, A);
  98.     V1 := S1;
  99.     For I := 2 To N Do
  100.         Begin
  101.             A := -100 + Random(201);
  102.             V_Spisok(V1, A);
  103.             V1 := V1^.Next
  104.         End;
  105.     WriteLn('Исходный список: ');
  106.     Print(S1);
  107.     V1 := s1; S2 := Nil; S3 := Nil;
  108.     While V1 <> Nil Do
  109.     Begin
  110.         If V1^.Inf > 0 Then
  111.             If S2 = Nil Then
  112.                 Begin
  113.                 V_Nachalo(S2, V1^.Inf);
  114.                 V2 := S2
  115.                 End
  116.             Else
  117.                 Begin
  118.                 V_Spisok(V2, V1^.Inf);
  119.                 V2 := V2^.Next
  120.                 End;
  121.         If V1^.Inf < 0 Then
  122.             If S3 = Nil Then
  123.                 Begin
  124.                 V_Nachalo(s3, V1^.Inf);
  125.                 V3 := S3
  126.                 End
  127.             Else
  128.                 Begin
  129.                 V_Spisok(V3, V1^.Inf);
  130.                 V3 := V3^.Next
  131.                 End;
  132.         V1:= V1^.Next
  133.     End;
  134.     WriteLn('Результирующий список из положительных элементов: ');
  135.     Print(S2);
  136.     WriteLn('Результирующий список из отрицательных элементов: ');
  137.     Print(S3);
  138.     Ochistka(S1);
  139.     Ochistka(S2);
  140.     Ochistka(S3);
  141. end.
Add Comment
Please, Sign In to add comment