Advertisement
Guest User

Untitled

a guest
Apr 6th, 2020
223
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 7.29 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. void create_ring();
  6. int read_single_number();
  7. long* read_n_elements(int n);
  8. void add_elements();
  9. void delete_elements_from_start();
  10. void delete_every_k_element();
  11. void show_start_message();
  12. void run();
  13. void show_input_message();
  14. bool confirm_exit();
  15. void print_ring();
  16. bool is_created();
  17. void show_not_created_message();
  18. void show_add_elements_message(int _count);
  19. void add_element(int value);
  20. int read_positive_number();
  21. void show_delete_error_message();
  22.  
  23. struct Node
  24. {
  25.     int value;
  26.     Node* next;
  27.  
  28.     Node(int _value)
  29.     {
  30.         value = _value;
  31.     }
  32.  
  33.     Node(int _value, Node* _next)
  34.     {
  35.         value = _value;
  36.         next = _next;
  37.     }
  38. };
  39.  
  40. struct Ring
  41. {
  42.     Node* start_node;
  43.  
  44.     void add(int value)
  45.     {
  46.         if(start_node == nullptr)
  47.         {
  48.             start_node = new Node(value);
  49.             start_node -> next = start_node;
  50.         }
  51.         else
  52.         {
  53.             add(start_node, value);
  54.         }
  55.     }
  56.  
  57.     void add(Node* parent, int value)
  58.     {
  59.         if(parent -> next == start_node)
  60.         {
  61.             Node* node = new Node(value);
  62.             parent -> next = node;
  63.             node -> next = start_node;
  64.         }
  65.         else
  66.         {
  67.             add(parent -> next, value);
  68.         }
  69.     }
  70.  
  71.     void delete_elements_from_start(int _count)
  72.     {
  73.         delete_node(start_node, _count);
  74.     }
  75.  
  76.     void delete_node(Node* node, int remain)
  77.     {
  78.         if(remain == 0)
  79.         {
  80.             Node* node = start_node;
  81.             start_node = node -> next;
  82.             delete node;
  83.         }
  84.         else
  85.         {
  86.             remain--;
  87.             delete_node(node -> next, remain);
  88.         }
  89.     }
  90.  
  91.     void delete_every_k_element(int _count, int k)
  92.     {
  93.         Node* current_node = start_node;
  94.         while(_count != 0)
  95.         {
  96.             for(int i = 0; i < k; i ++)
  97.             {
  98.                 current_node = current_node -> next;
  99.             }
  100.             current_node = current_node -> next;
  101.             _count--;
  102.         }
  103.     }
  104.  
  105.     void print_self()
  106.     {
  107.         if(start_node != nullptr)
  108.         {
  109.             cout << "The content of ring is: " << endl;
  110.             cout << start_node -> value << endl;
  111.  
  112.             Node* current_node = start_node;
  113.             while(current_node -> next != start_node)
  114.             {
  115.                 current_node = current_node -> next;
  116.                 cout << current_node -> value << endl;
  117.             }
  118.         }
  119.         else
  120.         {
  121.                cout << "The ring is empty" << endl;
  122.         }
  123.     }
  124.  
  125.     Ring()
  126.     {
  127.         start_node = nullptr;
  128.     }
  129. };
  130.  
  131.  
  132. Ring *ring = nullptr;
  133.  
  134. int main()
  135. {
  136.     show_start_message();
  137.     run();
  138. }
  139.  
  140. void run()
  141. {
  142.     bool is_running = true;
  143.     while(is_running)
  144.     {
  145.         show_input_message();
  146.         char c = getchar();
  147.         switch(c)
  148.         {
  149.             case 'a':
  150.                     add_elements();
  151.                     cin.ignore(numeric_limits<streamsize>::max(), '\n');
  152.                     break;
  153.             case 'c':
  154.                     create_ring();
  155.                     cin.ignore(numeric_limits<streamsize>::max(), '\n');
  156.                     break;
  157.             case 'd':
  158.                     delete_elements_from_start();
  159.                     cin.ignore(numeric_limits<streamsize>::max(), '\n');
  160.                     break;
  161.             case 'k':
  162.                     delete_every_k_element();
  163.                     cin.ignore(numeric_limits<streamsize>::max(), '\n');
  164.                     break;
  165.             case 'v':
  166.                     print_ring();
  167.                     cin.ignore(numeric_limits<streamsize>::max(), '\n');
  168.                     break;
  169.             default:
  170.                     cout << "Unknown action\n";
  171.                     cin.ignore(numeric_limits<streamsize>::max(), '\n');
  172.                     break;
  173.             case 'x':
  174.                     bool is_exiting = confirm_exit();
  175.                     is_running = !is_exiting;
  176.                     break;
  177.         }
  178.     }
  179. }
  180.  
  181. void create_ring()
  182. {
  183.     if(ring == nullptr)
  184.     {
  185.         ring = new Ring();
  186.         cout << "Ring successfully created" << endl;
  187.     }
  188.     else
  189.     {
  190.         cout << "Ring already created" << endl;
  191.     }
  192. }
  193.  
  194. void add_elements()
  195. {
  196.     if(!is_created())
  197.     {
  198.         show_not_created_message();
  199.     }
  200.     else
  201.     {
  202.         cout << "Enter N. N must be positive" << endl;
  203.         int n = read_positive_number();
  204.         show_add_elements_message(n);
  205.         for(int i = 0; i < n; i++)
  206.         {
  207.             int value = read_single_number();
  208.             ring -> add(value);
  209.         }
  210.     }
  211. }
  212.  
  213. void delete_elements_from_start()
  214. {
  215.     if(!is_created())
  216.     {
  217.         show_not_created_message();
  218.     }
  219.     else
  220.     {
  221.         cout << "Enter M. M must be positive" << endl;
  222.         int m = read_positive_number();
  223.  
  224.         if(ring -> start_node != nullptr)
  225.         {
  226.             show_delete_error_message();
  227.         }
  228.         ring -> delete_elements_from_start(m);
  229.     }
  230. }
  231.  
  232. void delete_every_k_element()
  233. {
  234.     if(!is_created())
  235.     {
  236.         show_not_created_message();
  237.     }
  238.     else
  239.     {
  240.         cout << "Enter M. M must be positive" << endl;
  241.         int m = read_positive_number();
  242.  
  243.         cout << "Enter M. M must be positive" << endl;
  244.         int k = read_positive_number();
  245.  
  246.         if(ring -> start_node != nullptr)
  247.         {
  248.             show_delete_error_message();
  249.         }
  250.         ring -> delete_every_k_element(m, k);
  251.     }
  252. }
  253.  
  254. void print_ring()
  255. {
  256.     if(!is_created())
  257.     {
  258.         show_not_created_message();
  259.     }
  260.     else
  261.     {
  262.         ring -> print_self();
  263.     }
  264. }
  265.  
  266. int read_single_number()
  267. {
  268.     string line;
  269.     int number = -1;
  270.     cin >> line;
  271.     stringstream string_stream(line);
  272.     string_stream >> number;
  273.     return number;
  274. }
  275.  
  276. int read_positive_number()
  277. {
  278.     bool is_valid = false;
  279.     int number = -1;
  280.     while(!is_valid)
  281.     {
  282.         number = read_single_number();
  283.         is_valid = (number > 0);
  284.     }
  285.     return number;
  286. }
  287.  
  288. bool is_created()
  289. {
  290.     bool is_created = (ring != nullptr);
  291.     return is_created;
  292. }
  293.  
  294. bool confirm_exit()
  295. {
  296.     cout << "Are you sure want to exit? Print y if so, n otherwise.\n";
  297.     cin.ignore(numeric_limits<streamsize>::max(), '\n');
  298.     char c = getchar();
  299.     bool is_exit = (c == 'y');
  300.     return is_exit;
  301. }
  302.  
  303. void show_start_message()
  304. {
  305.     cout << "This program allows you to create empty ring, add elements, delete elements from first node, delete every k element, view elements\n";
  306. }
  307.  
  308. void show_input_message()
  309. {
  310.     cout << "\nChoose what to do:\n";
  311.     cout << "a - add new records\n";
  312.     cout << "c - create ring\n";
  313.     cout << "d - delete elements from start\n";
  314.     cout << "k - delete every k element\n";
  315.     cout << "v - view elements\n";
  316.     cout << "x - exit\n";
  317. }
  318.  
  319. void show_delete_error_message()
  320. {
  321.     cout << "Cannot perform action. M is greater than ring size" << endl;
  322. }
  323.  
  324. void show_add_elements_message(int _count)
  325. {
  326.     cout << "Enter " << _count << " elements. Each element must be positive. Each element must be on a new line." << endl;
  327. }
  328.  
  329. void show_not_created_message()
  330. {
  331.     cout << "Error! Cannot perform action: ring isn't created yet." << endl;
  332. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement