sortir.pas 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. type
  2. plist = ^list;
  3. list = record
  4. val : integer;
  5. prev : plist;
  6. end;
  7. Procedure AddList(val : integer; var last:plist);
  8. var
  9. newli : plist;
  10. begin
  11. newli := last;
  12. New(last);
  13. last^.val := val;
  14. last^.prev := newli;
  15. end;
  16. var
  17. last : plist;
  18. newli: plist;
  19. k : plist;
  20. ends2: plist;
  21. vas,io: integer;
  22. begin
  23. New(last);
  24. last^.prev := nil;
  25. WriteLn('Enter Numbers, ended with error:');
  26. ReadLN(last^.val);
  27. {$I-}
  28. repeat
  29. readln(vas);
  30. io := IOResult;
  31. if (io<>0) then break;
  32. AddList(vas,last);
  33. until false;
  34. {$I+}
  35. New(newli);
  36. newli^.val := last^.val;
  37. newli^.prev := nil;
  38. k := last^.prev;
  39. Dispose(last);
  40. last := k;
  41. k := newli;
  42. repeat
  43. while (k^.val > last^.val) and (k^.prev <> nil) do k := k^.prev;
  44. if (k^.prev = nil) and (k^.val > last^.val) then
  45. begin
  46. New(ends2);
  47. ends2^.prev := nil;
  48. ends2^.val := last^.val;
  49. k^.prev := ends2;
  50. end
  51. else
  52. begin
  53. New(ends2);
  54. ends2^.prev := k^.prev;
  55. k^.prev := ends2;
  56. ends2^.val := k^.val;
  57. k^.val := last^.val;
  58. end;
  59. k := last^.prev;
  60. Dispose(last);
  61. last := k;
  62. k := newli;
  63. until last = nil;
  64. WriteLn('Output:');
  65. repeat
  66. k := newli^.prev;
  67. WriteLn(newli^.val);
  68. Dispose(newli);
  69. newli := k;
  70. until k = nil;
  71. WriteLn('End');
  72. end.