Guest User

Untitled

a guest
Jun 23rd, 2018
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Delphi 10.12 KB | None | 0 0
  1. {$APPTYPE CONSOLE}
  2. uses SysUtils, Math;
  3.  
  4. type
  5.   Plist = ^Tlist;
  6.   Tlist = record
  7.     value : integer;
  8.     next : Plist;
  9.   end;
  10.  
  11. var query : string;
  12.     val, _val, index : integer;
  13.     l : Plist;
  14.     found : boolean;
  15.  
  16. function size(const l : Plist) : integer; forward;
  17. procedure push_front(var l : Plist; new_val : integer); forward;
  18. procedure push_back(var l : Plist; new_val : integer); forward;
  19. function get_element_by_element(const l : Plist; find_val : integer) : Plist; forward;
  20. function get_element_by_index(const l : Plist; index : integer) : Plist; forward;
  21. procedure delete_front(var l : Plist); forward;
  22. procedure delete_last(var l : Plist); forward;
  23. procedure delete_element_by_index(var l : Plist; index : integer); forward;
  24. procedure delete_element_by_element(var l : Plist; find_val : integer); forward;
  25. procedure delete_all(var l : Plist; find_val : integer); forward;
  26. procedure insert_after_element(var l : Plist; value, add_value : integer); forward;
  27. function is_palin(const l : Plist; position : integer) : boolean; forward;
  28. //function index_of(const l : Plist; find_value, answer : integer) : integer; forward;
  29. procedure delete_many(var l : Plist; n, k : integer); forward;
  30. function check_sort(const l : Plist) : boolean; forward;
  31. procedure print(const l : Plist); forward;
  32. function all_equal(const l : Plist) : boolean; forward;
  33. function all_differ(const l : Plist) : boolean; forward;
  34.  
  35. function size(const l : Plist) : integer;
  36. begin
  37.   if (l = nil) then begin
  38.     result := 0;
  39.     exit;
  40.   end;
  41.   result := size(l^.next) + 1;
  42. end;
  43.  
  44. procedure push_front(var l : Plist; new_val : integer);
  45. var new_list : Plist;
  46. begin
  47.   new(new_list);
  48.   new_list^.value := new_val;
  49.   new_list^.next := l;
  50.   l := new_list;
  51. end;
  52.  
  53. procedure push_back(var l : Plist; new_val : integer);
  54. var new_list, last : Plist;
  55. begin
  56.   if (l = nil) then begin
  57.     new(new_list);
  58.     new_list^.value := new_val;
  59.     new_list^.next := nil;
  60.     l := new_list;
  61.     exit;
  62.   end;
  63.   last := get_element_by_index(l, size(l));
  64.   new(new_list);
  65.   new_list^.value := new_val;
  66.   new_list^.next := nil;
  67.   last^.next := new_list;
  68. end;
  69.  
  70. function get_element_by_element(const l : Plist; find_val : integer) : Plist;
  71. begin
  72.   if (l = nil) then begin
  73.     result := nil;
  74.     exit;
  75.   end;
  76.   if (l^.value = find_val) then
  77.     result := l
  78.   else
  79.     result := get_element_by_element(l^.next, find_val);
  80. end;                
  81.  
  82. function get_element_by_index(const l : Plist; index : integer) : Plist;
  83. begin
  84.   if (l = nil) then begin
  85.     result := nil;
  86.     exit;
  87.   end;
  88.   if (index = 1) then
  89.     result := l
  90.   else
  91.     result := get_element_by_index(l^.next, index - 1);
  92. end;
  93.  
  94. procedure delete_front(var l : Plist);
  95. begin
  96.   if (l = nil) then
  97.     exit;
  98.   l := l^.next;
  99. end;
  100.  
  101. procedure delete_last(var l : Plist);
  102. var last : Plist;
  103. begin
  104.   if (l = nil) then
  105.     exit;
  106.   if (l^.next = nil) then begin
  107.     l := nil;
  108.     exit;              
  109.   end;
  110.   last := get_element_by_index(l, size(l) - 1);
  111.   last^.next := nil;
  112. end;
  113.  
  114. procedure delete_element_by_index(var l : Plist; index : integer);
  115. begin
  116.   if (l = nil) then
  117.     exit;
  118.   if (index = 1) then begin
  119.     delete_front(l);
  120.     exit;
  121.   end;
  122.   if (index = 2) then begin
  123.     l^.next := (l^.next)^.next;
  124.     exit;
  125.   end;
  126.   delete_element_by_index(l^.next, index - 1);
  127. end;
  128.  
  129. procedure delete_element_by_element(var l : Plist; find_val : integer);
  130. begin
  131.   if (l = nil) then
  132.     exit;
  133.   if (l^.next = nil) then begin
  134.     if (l^.value = find_val) then
  135.       delete_front(l);
  136.     exit;
  137.   end;
  138.   if (l^.value = find_val) then begin
  139.     delete_front(l);
  140.     exit;
  141.   end;
  142.   if ((l^.next)^.value = find_val) then begin
  143.     l^.next := (l^.next)^.next;
  144.     exit;
  145.   end;
  146.   delete_element_by_element(l^.next, find_val);
  147. end;
  148.  
  149. {procedure delete_all(var l : Plist; find_val : integer);
  150. begin
  151.   if (l = nil) or (get_element_by_element(l, find_val) = nil) then
  152.     exit;
  153.   delete_element_by_element(l, find_val);
  154.   delete_all(l, find_val);
  155. end;}
  156.  
  157. procedure delete_all(var l : Plist; find_val : integer);
  158. begin
  159.   if (l = nil) or (l^.next = nil) then
  160.     exit;
  161.   if (l^.value = find_val) then begin
  162.     delete_front(l);
  163.     delete_all(l^.next, find_val);
  164.     exit;
  165.   end;
  166.   if ((l^.next)^.value = find_val) then
  167.     l^.next := (l^.next)^.next;
  168.   delete_all(l^.next, find_val);
  169. end;
  170.  
  171. procedure insert_after_element(var l : Plist; value, add_value : integer);
  172. var new_list : Plist;
  173. begin
  174.   if (l = nil) then
  175.     exit;
  176.   if (l^.value = value) then begin
  177.     new(new_list);
  178.     new_list^.value := add_value;
  179.     new_list^.next := l^.next;
  180.     l^.next := new_list;
  181.     exit;
  182.   end;
  183.   insert_after_element(l^.next, value, add_value);
  184. end;
  185.  
  186. function is_palin(const l : Plist; position : integer) : boolean;
  187. begin
  188.   if (l = nil) or (l^.next = nil) or (position > size(l) div 2) then begin
  189.     result := true;
  190.     exit;
  191.   end;
  192.   if (get_element_by_index(l, position)^.value <> get_element_by_index(l, size(l) - position + 1)^.value) then begin
  193.     result := false;
  194.     exit;
  195.   end;
  196.   result := is_palin(l^.next, position + 1);
  197. end;
  198.  
  199. function index_of(const l : Plist; val, depth : integer; var found : boolean) : integer;
  200. begin
  201.   if (l = nil) then begin
  202.     found := false;
  203.     result := -1;
  204.     exit;
  205.   end;
  206.   if (l^.value = val) then begin
  207.     found := true;
  208.     result := depth;
  209.     exit;
  210.   end;  
  211.   result := index_of(l^.next, val, depth + 1, found);
  212.   if (not found) then
  213.     result := -1;
  214. end;
  215.  
  216. procedure delete_many(var l : Plist; n, k : integer);
  217. begin
  218.   if (l = nil) or (k = 0) then
  219.     exit;
  220.   delete_element_by_index(l, n);
  221.   delete_many(l^.next, n, k - 1);
  222. end;
  223.  
  224. function check_sort(const l : Plist) : boolean;
  225. begin
  226.   if (l = nil) or (l^.next = nil) then begin
  227.     result := true;
  228.     exit;
  229.   end;
  230.   if (l^.value > (l^.next)^.value) then begin
  231.     result := false;
  232.     exit;
  233.   end;
  234.   result := check_sort(l^.next);
  235. end;
  236.  
  237. function all_equal(const l : Plist) : boolean;
  238. begin
  239.   if (l = nil) or (l^.next = nil) then begin
  240.     result := true;
  241.     exit;
  242.   end;
  243.   if (l^.value <> (l^.next)^.value) then begin
  244.     result := false;
  245.     exit;
  246.   end;
  247.   result := all_equal(l^.next);
  248. end;
  249.  
  250. function all_differ(const l : Plist) : boolean;
  251. var i, j : integer;
  252. begin
  253.   result := true;
  254.   for i := 1 to size(l) do
  255.     for j := i + 1 to size(l) do
  256.       if (get_element_by_index(l, i)^.value = get_element_by_index(l, j)^.value) then begin
  257.         result := false;
  258.         exit;
  259.       end;
  260. end;
  261.  
  262. procedure insert_to_sorted(var l : Plist; x : integer);
  263. var new_list : Plist;
  264. begin
  265.   if (l = nil) then
  266.     exit;
  267.   if (l^.next <> nil) then begin
  268.     if ((l^.next)^.value >= x) and (l^.value <= x) then begin
  269.       new(new_list);
  270.       new_list^.value := x;
  271.       new_list^.next := l^.next;
  272.       l^.next := new_list;
  273.       exit;
  274.     end;
  275.     insert_to_sorted(l^.next, x);
  276.   end else begin
  277.     new(new_list);
  278.     new_list^.value := x;
  279.     new_list^.next := nil;
  280.     l^.next := new_list;
  281.     exit;
  282.   end;
  283. end;
  284.  
  285. procedure print(const l : Plist);
  286. begin
  287.   if (l = nil) then
  288.     exit;
  289.   if (l^.next = nil) then begin
  290.     writeln(l^.value, '.');
  291.     exit;
  292.   end;
  293.   write(l^.value, ', ');
  294.   print(l^.next);
  295. end;
  296.  
  297. begin
  298.   //reset(input, 'commands.txt');
  299.   //rewrite(output, 'answer.txt');
  300.   l := nil;
  301.   writeln('You can enter some commands.');
  302.   writeln('Here are the commands: "Push back", "Push front", "Delete front", "Delete last", "Delete element by index"');
  303.   writeln('                       "Delete element by element", "Delete all elements equal to x", "Insert after element"');
  304.   writeln('                       "Check list for palindrome", "Find Index of x", "Delete many", "Check sort", "All Equal"');
  305.   writeln('                       "All Differ", "Insert to sorted", "Size"');
  306.   while (not(EOF)) do begin
  307.     readln(query);
  308.     if (query = 'Push front') then begin
  309.       readln(val);
  310.       push_front(l, val);
  311.     end;
  312.     if (query = 'Size') then begin
  313.       writeln(size(l));
  314.     end;
  315.     if (query = 'Push back') then begin
  316.       readln(val);
  317.       push_back(l, val);
  318.     end;
  319.     if (query = 'Delete front') then
  320.       delete_front(l);
  321.     if (query = 'Delete last') then
  322.       delete_last(l);
  323.     if (query = 'Delete element by index') then begin
  324.       readln(index);
  325.       delete_element_by_index(l, index);
  326.     end;
  327.     if (query = 'Delete element by element') then begin
  328.       readln(val);
  329.       delete_element_by_element(l, val);
  330.     end;
  331.     if (query = 'Delete all elements equal to x') then begin
  332.       readln(val);
  333.       delete_all(l, val);
  334.     end;
  335.     if (query = 'Insert after element') then begin
  336.       readln(val, _val);
  337.       insert_after_element(l, val, _val);
  338.     end;
  339.     if (query = 'Check list for a palindrome') then begin
  340.       if (is_palin(l, 1)) then  
  341.         writeln('List is a palindrom')
  342.       else
  343.         writeln('List is not a palindrom');
  344.       writeln;    
  345.     end;
  346.     if (query = 'Find Index of x') then begin
  347.       readln(val);
  348.       found := false;
  349.       writeln(index_of(l, val, 1, found));
  350.     end;              
  351.     if (query = 'Delete many') then begin
  352.       readln(val, _val);
  353.       delete_many(l, val, _val);
  354.     end;
  355.     if (query = 'Check sort') then begin
  356.       if (check_sort(l)) then
  357.         writeln('The list is sorted')
  358.       else
  359.         writeln('The list is unsorted');
  360.       writeln;
  361.     end;
  362.     if (query = 'All Equal') then begin
  363.       if (all_equal(l)) then
  364.         writeln('All elements in list are equal')
  365.       else
  366.         writeln('Some elements in list are differ');
  367.       writeln;
  368.     end;
  369.     if (query = 'All Differ') then begin
  370.       if (all_differ(l)) then
  371.         writeln('All elements in list are differ')
  372.       else
  373.         writeln('Some elements in list are equal');
  374.       writeln;
  375.     end;
  376.     if (query = 'Insert to sorted') then begin
  377.       readln(val);
  378.       assert(check_sort(l));
  379.       insert_to_sorted(l, val);
  380.     end;
  381.     if (size(l) = 0) then begin
  382.       writeln('List is clear');
  383.       writeln;
  384.       continue;
  385.     end;
  386.     writeln('List: ');        
  387.     print(l);
  388.     writeln;
  389.   end;                      
  390. end.
Add Comment
Please, Sign In to add comment