Advertisement
debosch

lab14

Jan 24th, 2020
124
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.51 KB | None | 0 0
  1. /*
  2.     Лабораторная работа №14
  3.     Шильцин Влад
  4.     Вариант-46.
  5.     Ввести последовательность натуральных чисел.
  6.     Если последовательность упорядочена по не убыванию первой или последней цифры,
  7.     удалить из последовательности числа, в которые входят цифры 2 и 3 (одновременно),
  8.     и продублировать числа, начинающиеся цифрой 5.
  9.     В противном случае упорядочить последовательность по не убыванию.
  10.     Последовательность хранить в односвязном списке.
  11. */
  12.  
  13. #include <iostream>
  14. #include <Windows.h>
  15. #include <limits.h>
  16.  
  17. using namespace std;
  18.  
  19. class List
  20. {
  21. public:
  22.     List();
  23.     ~List();
  24.  
  25.     void add(int data);
  26.     void pop_front();
  27.     void push_front(int data);
  28.     void insert(int data, int index);
  29.     void removeAt(int index);
  30.     void clear();
  31.     int get_size() { return size; }
  32.     int& operator[](const int index);
  33.  
  34. private:
  35.     class Node
  36.     {
  37.     public:
  38.         Node *next;
  39.         int data;
  40.         Node(int data = -1, Node *next = nullptr)
  41.         {
  42.             this->data = data;
  43.             this->next = next;
  44.         }
  45.     };
  46.  
  47.     Node *head;
  48.     int size;
  49. };
  50.  
  51. List::List()
  52. {
  53.     size = 0;
  54.     head = nullptr;
  55. }
  56.  
  57. List::~List()
  58. {
  59.     clear();
  60. }
  61.  
  62. void List::add(int data)
  63. {
  64.     if (head == nullptr)
  65.         head = new Node(data);
  66.     else
  67.     {
  68.         Node* current = this->head;
  69.  
  70.         while (current->next != nullptr)
  71.         {
  72.             current = current->next;
  73.         }
  74.  
  75.         current->next = new Node(data);
  76.     }
  77.     size++;
  78. }
  79.  
  80. void List::pop_front()
  81. {
  82.     Node* temp_head = head;
  83.     head = head->next;
  84.     delete temp_head;
  85.     size--;
  86. }
  87.  
  88. void List::push_front(int data)
  89. {
  90.     head = new Node(data, head);
  91.     size++;
  92. }
  93.  
  94. void List::insert(int data, int index)
  95. {
  96.     if (index == 0)
  97.         push_front(data);
  98.     else
  99.     {
  100.         Node* previous = this->head;
  101.         for (int i = 0; i < index - 1; i++)
  102.             previous = previous->next;
  103.  
  104.         Node* newNode = new Node(data, previous->next);
  105.         previous->next = newNode;
  106.  
  107.         size++;
  108.     }
  109. }
  110.  
  111. void List::removeAt(int index)
  112. {
  113.     if (index == 0)
  114.         pop_front();
  115.     else
  116.     {
  117.         Node* previous = this->head;
  118.         for (int i = 0; i < index - 1; i++)
  119.             previous = previous->next;
  120.  
  121.         Node* temp_node = previous->next;
  122.         previous->next = temp_node->next;
  123.         delete temp_node;
  124.  
  125.         size--;
  126.     }
  127. }
  128.  
  129. void List::clear()
  130. {
  131.     while (size)
  132.         pop_front();
  133. }
  134.  
  135. int& List::operator[](const int index)
  136. {
  137.     int counter = 0;
  138.     Node* current = this->head;
  139.  
  140.     while (current != nullptr)
  141.     {
  142.         if (counter == index)
  143.             return current->data;
  144.  
  145.         current = current->next;
  146.         counter++;
  147.     }
  148. }
  149.  
  150. int first_digit(int digit)
  151. {
  152.     while (digit > 9)
  153.         digit /= 10;
  154.  
  155.     return digit;
  156. }
  157.  
  158. int last_digit(int digit)
  159. {
  160.     return digit % 10;
  161. }
  162.  
  163. void m_swap(int& a, int& b)
  164. {
  165.     int t = b;
  166.     b = a;
  167.     a = t;
  168. }
  169.  
  170. bool contains_2_and_3(int digit)
  171. {
  172.     bool contains2 = false;
  173.     bool contains3 = false;
  174.     while (digit)
  175.     {
  176.         int t = digit % 10;
  177.  
  178.         if (t == 2)
  179.             contains2 = true;
  180.         if (t == 3)
  181.             contains3 = true;
  182.  
  183.         digit /= 10;
  184.     }
  185.  
  186.     if (contains2 && contains3)
  187.         return true;
  188.  
  189.     return false;
  190. }
  191.  
  192. int main()
  193. {
  194.     List list;
  195.  
  196.     int n = 0;
  197.     int previous_first_digit = -1;
  198.     int previous_last_digit = -1;
  199.  
  200.     bool first_digit_streamlined = true;
  201.     bool last_digit_streamlined = true;
  202.  
  203.     scanf_s("%d", &n);
  204.  
  205.     for (int i = 0; i < n; i++)
  206.     {
  207.         int t = 0;
  208.         scanf_s("%d", &t);
  209.  
  210.         int temp_first = first_digit(t);
  211.         int temp_last = last_digit(t);
  212.  
  213.         if (previous_first_digit > temp_first)
  214.             first_digit_streamlined = false;
  215.         else
  216.             previous_first_digit = temp_first;
  217.  
  218.         if (previous_last_digit > temp_last)
  219.             last_digit_streamlined = false;
  220.         else
  221.             previous_last_digit = temp_last;
  222.  
  223.         list.add(t);
  224.     }
  225.  
  226.     if (last_digit_streamlined || first_digit_streamlined)
  227.     {
  228.         for (int i = 0; i < list.get_size(); i++)
  229.             if (contains_2_and_3(list[i]))
  230.             {
  231.                 list.removeAt(i);
  232.                 i--;
  233.             }
  234.  
  235.         for (int i = 0; i < list.get_size(); i++)
  236.             if (first_digit(list[i]) == 5)
  237.             {
  238.                 list.insert(list[i], i);
  239.                 i++;
  240.             }
  241.     }
  242.     else
  243.     {
  244.         for (int i = 0; i < list.get_size() - 1; i++)
  245.         {
  246.             bool is_changed = false;
  247.             for (int j = i + 1; j < list.get_size(); j++)
  248.                 if (list[i] > list[j])
  249.                 {
  250.                     m_swap(list[i], list[j]);
  251.                     is_changed = true;
  252.                 }
  253.  
  254.             if (!is_changed) break;
  255.         }
  256.     }
  257.  
  258.     for (int i = 0; i < list.get_size(); i++)
  259.         cout << list[i] << " ";
  260.    
  261.     return 0;
  262. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement