Advertisement
Guest User

Untitled

a guest
Jan 22nd, 2018
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Pascal 3.89 KB | None | 0 0
  1. Program Stek;
  2. uses
  3.   crt; {Для использования readkey и clrscr}
  4. type
  5.   Tinf=integer; {тип данных, который будет храниться в элементе стека}
  6.   List=^TList;  {Указатель на элемент типа TList}
  7.   TList=record {А это наименование нашего типа "запись" обычно динамические структуры описываются через запись}
  8.     data:TInf;  {данные, хранимые в элементе}
  9.     next:List;   {указатель на следующий элемент}
  10.   end;
  11.  
  12. {Процедура добавляющая элемент в стек}
  13. procedure AddElem(var stek1:List;znach1:TInf);
  14. var
  15.   tmp:List;
  16. begin
  17.   GetMem(tmp,sizeof(TList)); {выделяем в памяти место для нового элемента}
  18.   tmp^.next:=stek1;  {указатель на следующий элемент "направляем" на вершину стека}
  19.   tmp^.data:=znach1; {добавляем к элементу данные}
  20.   stek1:=tmp; {вершина стека изменилась, надо перенести и указатели на неё}
  21. end;
  22.  
  23. {Процедура вывода стека}
  24. procedure Print(stek1:List);
  25. begin
  26.   if stek1=nil then {проверка на пустоту стека}
  27.   begin
  28.     writeln('Стек пуст.');
  29.     exit;
  30.   end;
  31.   while stek1<>nil do {пока указатель stek1 не станет указывать в пустоту}
  32.   begin   {а это произойдёт как только он перейдёт по ссылке последнего элемента}
  33.     Write(stek1^.data, ' '); {выводить данне}
  34.     stek1:=stek1^.next  {и переносить указатель вглубь по стеку}
  35.   end;
  36. end;
  37.  
  38. {Процедура освобождения памяти занятой стеком}
  39. Procedure FreeStek(stek1:List);
  40. var
  41.   tmp:List;
  42. begin
  43.   while stek1<>nil do {пока stek1 не станет указывать в "пустоту" делать}
  44.   begin
  45.     tmp:=stek1; {указатель tmp направим на вершину стека}
  46.     stek1:=stek1^.next; {вершину стека перенесём на следующий за данной вершиной элемент}
  47.     FreeMem(tmp,SizeOf(Tlist)); {освободим память занятую под старую вершину}
  48.   end;
  49. end;
  50.    
  51. {Процедура сортировки "пузырьком" с изменением только данных}
  52. procedure SortBublInf(nach:list);
  53. var
  54.   tmp,rab:List;
  55.   tmps:Tinf;
  56. begin
  57.   GetMem(tmp,SizeOf(Tlist)); {выделяем память для рабочего "буфера" обмена}
  58.   rab:=nach; {рабочая ссылка, становимся на вершину стека}
  59.   while rab<>nil do {пока мы не дойдём до конца стека делать}
  60.   begin
  61.     tmp:=rab^.next; {перейдём на следующий элемент}
  62.     while tmp<>nil do {пока не конец стека делать}
  63.     begin
  64.       if tmp^.data<rab^.data then {проверяем следует ли менять элементы}
  65.       begin
  66.         tmps:=tmp^.data; {стандартная замена в 3 операции}
  67.         tmp^.data:=rab^.data;
  68.         rab^.data:=tmps
  69.       end;
  70.       tmp:=tmp^.next {переход к следующему элементу}
  71.     end;
  72.     rab:=rab^.next {переход к следующему элементу}
  73.   end
  74. end;
  75.  
  76. var
  77.   Spis:List;
  78.   znach, n, i:integer;
  79. begin
  80.   Spis:=nil;
  81.   write('n=');
  82.   read(n);
  83.   for i:=1 to n do
  84.   begin
  85.       read(znach);
  86.       AddElem(Spis,znach);
  87.   end;
  88.  
  89.   Print(Spis);
  90.   writeln;
  91.   SortBublInf(Spis);
  92.   writeln;
  93.   Print(Spis);
  94.   FreeStek(Spis); //освобождение памяти
  95.  
  96.   readkey;
  97. end.
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement