Advertisement
Bibodui

ООП Лаба 6

May 12th, 2021
111
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 14.39 KB | None | 0 0
  1. /*
  2. Страница 125, номер 23:
  3. Разработать шаблон списка, реализовав групповые добавления, удаление и замену элементов.
  4. Группа представляется диапазоном итераторов.
  5. Реализовать методы поиска элементов и групп элементов.
  6. Добавить методы комбинирования списков как объединение и пересечение множеств.
  7. */
  8.  
  9. #include <iostream>
  10. #include <Windows.h>
  11.  
  12. using namespace std;
  13.  
  14. template <typename T>
  15. class List
  16. {
  17.     template <typename T>
  18.     struct Node
  19.     {
  20.         T value;
  21.         Node<T>* pNext;
  22.  
  23.         Node(T value = T(), Node<T>* pNext = nullptr)
  24.         {
  25.             this->value = value;
  26.             this->pNext = pNext;
  27.         }
  28.     };
  29.  
  30.     Node<T> *head;
  31.     int size;
  32.  
  33. public:
  34.     class iterator;
  35.     List();
  36.     List(T);
  37.  
  38.     void initial(T);
  39.     void add_one(int, iterator);
  40.     void add_group(iterator, int, T);
  41.     void del_one(iterator);
  42.     void del_group(iterator, iterator);
  43.     void rep_group(iterator, iterator);
  44.     bool is_empty();
  45.     int search_value(T);
  46.     void list_union(List<T>, List<T>);
  47.     void list_intersection(List<T>, List<T>);
  48.  
  49.  
  50.  
  51.  
  52.     iterator begin() const
  53.     {
  54.         return iterator(head);
  55.     }
  56.     iterator end() const
  57.     {
  58.         Node<T>* it = head;
  59.         for (int i = 0; i < size; i++)
  60.             it = it->pNext;
  61.         return iterator(it);
  62.  
  63.     }
  64.     void output()
  65.     {
  66.         for (iterator it(begin()); it != end(); it++)
  67.         {
  68.             cout << *it << ' ';
  69.         }
  70.     }
  71.     int size_out()
  72.     {
  73.         return size;
  74.     }
  75. };
  76.  
  77. template <typename T>
  78. class List<T>::iterator
  79. {
  80.     Node<T>* elem;
  81. public:
  82.     iterator(Node<T>* node)
  83.     {
  84.         elem = node;
  85.     }
  86.     bool operator==(const iterator& it)
  87.     {
  88.         return elem == it.elem;
  89.     }
  90.  
  91.     bool operator!=(const iterator& it)
  92.     {
  93.         return !(*this == it);
  94.     }
  95.  
  96.     iterator operator++()
  97.     {
  98.         elem = elem->pNext;
  99.         return *this;
  100.     }
  101.  
  102.     iterator operator++(int)
  103.     {
  104.         iterator tmp = *this;
  105.         elem = elem->pNext;
  106.         return tmp;
  107.     }
  108.  
  109.     iterator operator+=(int size)
  110.     {
  111.         for (int i = 0; i < size; i++)
  112.             elem = elem->pNext;
  113.         return *this;
  114.     }
  115.    
  116.     T& operator*()
  117.     {
  118.         return elem->value;
  119.     }
  120.  
  121. };
  122.  
  123.  
  124.  
  125.  
  126. //конструкторы
  127. template <typename T>
  128. List<T>::List()
  129. {
  130.     head = nullptr;
  131.     size = 0;
  132. }
  133. template <typename T>
  134. List<T>::List(T value)
  135. {
  136.     head = new Node<T>(value);
  137.     size = 1;
  138. }
  139.  
  140.  
  141.  
  142.  
  143. //добавление
  144. template <typename T>
  145. void List<T>::initial(T value)
  146. {
  147.     head = new Node<T>;
  148.     head->value = value;
  149.     size++;
  150. }
  151. template <typename T>
  152. void List<T>::add_one(int elem, iterator it)
  153. {
  154.     Node<T>* tmp = head;
  155.     Node<T>* new_node = new Node<T>(elem);
  156.  
  157.     if (!is_empty())
  158.     {
  159.         for (iterator it_tmp(begin()); it_tmp != it && tmp->pNext != nullptr; it_tmp++)
  160.             tmp = tmp->pNext;
  161.         new_node->pNext = tmp->pNext;
  162.         tmp->pNext = new_node;
  163.         size++;
  164.     }
  165.     else
  166.     {
  167.         head = new Node<T>(elem);
  168.         head->pNext = nullptr;
  169.         size++;
  170.     }
  171. }
  172. template <typename T>
  173. void List<T>::add_group(iterator it_begin, int n, T value)
  174. {
  175.     iterator it_tmp(it_begin);
  176.     for (int i = 0; i < n; it_tmp++, i++)
  177.     {
  178.         this->add_one(value, it_tmp);
  179.         if (it_tmp == nullptr)
  180.             it_tmp = begin();
  181.     }
  182. }
  183.  
  184.  
  185.  
  186.  
  187. //удаление
  188. template <typename T>
  189. void List<T>::del_one(iterator it)
  190. {
  191.  
  192.     if (!is_empty())
  193.     {
  194.         if (it != begin())
  195.         {
  196.             iterator it_tmp(begin());
  197.             Node<T>* tmp = head;
  198.             Node<T>* tmp2 = head;
  199.             for (; it_tmp != it; it_tmp++)
  200.             {
  201.                 tmp = tmp->pNext;
  202.             }
  203.             while (tmp2->pNext != tmp)
  204.             {
  205.                 tmp2 = tmp2->pNext;
  206.             }
  207.             Node<T>* old_node = tmp;
  208.             tmp2->pNext = old_node->pNext;
  209.             delete[]old_node;
  210.         }
  211.         else if (head->pNext != nullptr)
  212.         {
  213.             Node<T>* old_node = head;
  214.             head = head->pNext;
  215.             it = head;
  216.             delete[] old_node;
  217.         }
  218.         else
  219.         {
  220.             delete[]head;
  221.             it = nullptr;
  222.         }
  223.         size--;
  224.     }
  225.     else cout << "Список пуст" << endl;
  226. }
  227. template <typename T>
  228. void List<T>::del_group(iterator it_begin, iterator it_end)
  229. {
  230.     iterator it_tmp(it_begin);
  231.     iterator it_tmp2(it_begin);
  232.     while (it_tmp != it_end)
  233.     {
  234.         it_tmp2++;
  235.         this->del_one(it_tmp);
  236.         it_tmp = it_tmp2;
  237.     }
  238. }
  239.  
  240.  
  241.  
  242.  
  243. //замена
  244. template <typename T>
  245. void List<T>::rep_group(iterator it_begin, iterator it_end)
  246. {
  247.     T elem;
  248.     Node<T> *tmp = head;
  249.     iterator it_tmp2(begin());
  250.     while (it_tmp2 != it_begin)
  251.     {
  252.         it_tmp2++;
  253.         tmp = tmp->pNext;
  254.     }
  255.     for (iterator it_tmp(it_begin); it_tmp != it_end; it_tmp++, tmp = tmp->pNext)
  256.     {
  257.         cin >> elem;
  258.         tmp->value = elem;
  259.     }
  260. }
  261.  
  262.  
  263.  
  264. //проверка на пустоту
  265. template <typename T>
  266. bool List<T>::is_empty()
  267. {
  268.     return size == 0;
  269. }
  270.  
  271.  
  272.  
  273.  
  274. //поиск элемента
  275. template <typename T>
  276. int List<T>::search_value(T value)
  277. {
  278.     Node<T>* it = head;
  279.     int count = 0;
  280.     while (it != nullptr)
  281.     {
  282.         if (it->value == value)
  283.             return count;
  284.         it = it->pNext;
  285.         count++;
  286.     }
  287.     return -1;
  288. }
  289.  
  290.  
  291.  
  292.  
  293. //объединение и пересечение
  294. template <typename T>
  295. void List<T>::list_union(List<T> list_1, List<T> list_2)
  296. {
  297.     iterator it_begin(list_1.begin());
  298.     iterator it_end(list_1.end());
  299.     iterator it_tmp(list_1.begin());
  300.     iterator it_tmp2(begin());
  301.     for (; it_tmp != it_end; it_tmp++, it_tmp2++)
  302.     {
  303.         this->add_one(*it_tmp, it_tmp2);
  304.         if (it_tmp2 == nullptr)
  305.             it_tmp2 = begin();
  306.     }
  307.     it_begin = list_2.begin();
  308.     it_end = list_2.end();
  309.     it_tmp = list_2.begin();
  310.     for (; it_tmp != it_end; it_tmp++, it_tmp2++)
  311.     {
  312.         this->add_one(*it_tmp, it_tmp2);
  313.         if (it_tmp2 == nullptr)
  314.             it_tmp2 = begin();
  315.     }
  316. }
  317. template <typename T>
  318. void List<T>::list_intersection(List<T> list_1, List<T> list_2)
  319. {
  320.     iterator it_begin1(list_1.begin());
  321.     iterator it_end1(list_1.end());
  322.     iterator it_begin2(list_2.begin());
  323.     iterator it_end2(list_2.end());
  324.     iterator it_tmp(list_1.begin());
  325.     iterator it_tmp2(list_2.begin());
  326.     iterator it_tmp3(begin());
  327.     bool repeat = false;
  328.     for (; it_tmp != it_end1; it_tmp++)
  329.     {
  330.         for (it_tmp2 = list_2.begin(), repeat = false; it_tmp2 != it_end2 && repeat == false; it_tmp2++)
  331.         {
  332.             if (*it_tmp == *it_tmp2)
  333.             {
  334.                 this->add_one(*it_tmp, it_tmp3);
  335.                 if (it_tmp3 == nullptr)
  336.                     it_tmp3 = begin();
  337.                 it_tmp3++;
  338.                 repeat = true;
  339.             }
  340.         }
  341.     }
  342. }
  343.  
  344.  
  345.  
  346. int main()
  347. {
  348.     SetConsoleOutputCP(1251);
  349.     SetConsoleCP(1251);
  350.  
  351.     int q;
  352.     List<int> list_1;
  353.     List<int> list_2;
  354.     List<int> list_3;
  355.     int tmp;
  356.     int n = 0;
  357.     List<int>::iterator it(list_1.begin());
  358.     List<int>::iterator it2(list_1.begin());
  359.     int size = 0;
  360.  
  361.     do
  362.     {
  363.         cout << "Выберите действие:" << endl;
  364.         cout << "1. Добавить элемент в список" << endl;
  365.         cout << "2. Добавить группу элементов в список" << endl;
  366.         cout << "3. Удалить элемент из списка" << endl;
  367.         cout << "4. Удалить группу элементов из списка" << endl;
  368.         cout << "5. Вывести список" << endl;
  369.         cout << "6. Найти элемент" << endl;
  370.         cout << "7. Объединение двух списков" << endl;
  371.         cout << "8. Пересечение двух списков" << endl;
  372.         cout << "0. Выход" << endl;
  373.  
  374.         cin >> q;
  375.  
  376.         switch (q)
  377.         {
  378.         case 1:
  379.             cout << "1. Добавить элемент в список 1" << endl;
  380.             cout << "2. Добавить элемент в список 2" << endl;
  381.             cin >> q;
  382.             switch (q)
  383.             {
  384.             case 1:
  385.                 cout << "Введите место вставки элемента:" << endl;
  386.                 cin >> tmp;
  387.                 size = list_1.size_out();
  388.                 while (tmp >= size)
  389.                 {
  390.                     cout << "Место должно находиться в списке" << endl;
  391.                     cout << "Введите место вставки элемента:" << endl;
  392.                     cin >> tmp;
  393.                 }
  394.                 it = list_1.begin();
  395.                 it += tmp;
  396.                 cout << "Введите значение элемента:" << endl;
  397.                 cin >> tmp;
  398.                 list_1.add_one(tmp, it);
  399.                 break;
  400.             case 2:
  401.                 cout << "Введите место вставки элемента:" << endl;
  402.                 cin >> tmp;
  403.                 size = list_2.size_out();
  404.                 while (tmp >= size)
  405.                 {
  406.                     cout << "Место должно находиться в списке" << endl;
  407.                     cout << "Введите место вставки элемента:" << endl;
  408.                     cin >> tmp;
  409.                 }
  410.                 it = list_2.begin();
  411.                 it += tmp;
  412.                 cout << "Введите значение элемента:" << endl;
  413.                 cin >> tmp;
  414.                 list_2.add_one(tmp, it);
  415.                 break;
  416.             }
  417.             break;
  418.         case 2:
  419.             cout << "1. Добавить группу элементов в список 1" << endl;
  420.             cout << "2. Добавить группу элементов в список 2" << endl;
  421.             cin >> q;
  422.             switch (q)
  423.             {
  424.             case 1:
  425.                 cout << "Введите место вставки элемента:" << endl;
  426.                 cin >> tmp;
  427.                 size = list_1.size_out();
  428.                 while (tmp >= size)
  429.                 {
  430.                     cout << "Место должно находиться в списке" << endl;
  431.                     cout << "Введите место вставки элемента:" << endl;
  432.                     cin >> tmp;
  433.                 }
  434.                 it = list_1.begin();
  435.                 it += tmp;
  436.                 cout << "Введите количество элементов:" << endl;
  437.                 cin >> n;
  438.                 cout << "Введите значение элемента:" << endl;
  439.                 cin >> tmp;
  440.                 list_1.add_group(it, n, tmp);
  441.                 break;
  442.             case 2:
  443.                 cout << "Введите место вставки элемента:" << endl;
  444.                 cin >> tmp;
  445.                 size = list_2.size_out();
  446.                 while (tmp >= size)
  447.                 {
  448.                     cout << "Место должно находиться в списке" << endl;
  449.                     cout << "Введите место вставки элемента:" << endl;
  450.                     cin >> tmp;
  451.                 }
  452.                 it = list_2.begin();
  453.                 it += tmp;
  454.                 cout << "Введите количество элементов:" << endl;
  455.                 cin >> n;
  456.                 cout << "Введите значение элемента:" << endl;
  457.                 cin >> tmp;
  458.                 list_2.add_group(it, n, tmp);
  459.                 break;
  460.             }
  461.             break;
  462.         case 3:
  463.             cout << "1. Удалить элемент из списка 1" << endl;
  464.             cout << "2. Удалить элемент из списка 2" << endl;
  465.             cin >> q;
  466.             switch (q)
  467.             {
  468.             case 1:
  469.                 cout << "Введите место удаляемого элемента:" << endl;
  470.                 cin >> tmp;
  471.                 size = list_1.size_out();
  472.                 while (tmp >= size)
  473.                 {
  474.                     cout << "Место должно находиться в списке" << endl;
  475.                     cout << "Введите место вставки элемента:" << endl;
  476.                     cin >> tmp;
  477.                 }
  478.                 it = list_1.begin();
  479.                 it += tmp;
  480.                 list_1.del_one(it);
  481.                 break;
  482.             case 2:
  483.                 cout << "Введите место удаляемого элемента:" << endl;
  484.                 cin >> tmp;
  485.                 size = list_2.size_out();
  486.                 while (tmp >= size)
  487.                 {
  488.                     cout << "Место должно находиться в списке" << endl;
  489.                     cout << "Введите место вставки элемента:" << endl;
  490.                     cin >> tmp;
  491.                 }
  492.                 it = list_2.begin();
  493.                 it += tmp;
  494.                 list_2.del_one(it);
  495.                 break;
  496.             }
  497.             break;
  498.         case 4:
  499.             cout << "1. Удалить группу элементов из списка 1" << endl;
  500.             cout << "2. Удалить группу элементов из списка 2" << endl;
  501.             cin >> q;
  502.             switch (q)
  503.             {
  504.             case 1:
  505.                 cout << "Введите начало диапазона удаления:" << endl;
  506.                 cin >> tmp;
  507.                 size = list_1.size_out();
  508.                 while (tmp >= size)
  509.                 {
  510.                     cout << "Место должно находиться в списке" << endl;
  511.                     cout << "Введите место вставки элемента:" << endl;
  512.                     cin >> tmp;
  513.                 }
  514.                 it = list_1.begin();
  515.                 it += tmp;
  516.                 cout << "Введите конец диапазона удаления:" << endl;
  517.                 cin >> tmp;
  518.                 size = list_1.size_out();
  519.                 while (tmp >= size)
  520.                 {
  521.                     cout << "Место должно находиться в списке" << endl;
  522.                     cout << "Введите место вставки элемента:" << endl;
  523.                     cin >> tmp;
  524.                 }
  525.                 it2 = list_1.begin();
  526.                 it2 += tmp;
  527.                 list_1.del_group(it, it2);
  528.                 break;
  529.             case 2:
  530.                 cout << "Введите начало диапазона удаления:" << endl;
  531.                 cin >> tmp;
  532.                 size = list_2.size_out();
  533.                 while (tmp >= size)
  534.                 {
  535.                     cout << "Место должно находиться в списке" << endl;
  536.                     cout << "Введите место вставки элемента:" << endl;
  537.                     cin >> tmp;
  538.                 }
  539.                 it = list_2.begin();
  540.                 it += tmp;
  541.                 cout << "Введите конец диапазона удаления:" << endl;
  542.                 cin >> tmp;
  543.                 size = list_2.size_out();
  544.                 while (tmp >= size)
  545.                 {
  546.                     cout << "Место должно находиться в списке" << endl;
  547.                     cout << "Введите место вставки элемента:" << endl;
  548.                     cin >> tmp;
  549.                 }
  550.                 it2 = list_2.begin();
  551.                 it2 += tmp;
  552.                 list_2.del_group(it, it2);
  553.                 break;
  554.             }
  555.             break;
  556.         case 5:
  557.             cout << "1. Вывести список 1" << endl;
  558.             cout << "2. Вывести список 2" << endl;
  559.             cin >> q;
  560.             switch (q)
  561.             {
  562.             case 1:
  563.                 cout << "Список 1: ";
  564.                 list_1.output();
  565.                 cout << endl;
  566.                 break;
  567.             case 2:
  568.                 cout << "Список 2: ";
  569.                 list_2.output();
  570.                 cout << endl;
  571.                 break;
  572.             }
  573.             break;
  574.         case 6:
  575.             cout << "1. Поиск в списке 1" << endl;
  576.             cout << "2. Поиск в списке 2" << endl;
  577.             cin >> q;
  578.             switch (q)
  579.             {
  580.             case 1:
  581.                 cout << "Введите значение элемента:" << endl;
  582.                 cin >> tmp;
  583.                 if (list_1.search_value(tmp) == -1)
  584.                     cout << "Такого элемента нет в списке" << endl;
  585.                 else cout << "Номер элемента: " << list_1.search_value(tmp) << endl;
  586.                 break;
  587.             case 2:
  588.                 cout << "Введите значение элемента:" << endl;
  589.                 cin >> tmp;
  590.                 if (list_2.search_value(tmp) == -1)
  591.                     cout << "Такого элемента нет в списке" << endl;
  592.                 else cout << "Номер элемента: " << list_2.search_value(tmp) << endl;
  593.                 break;
  594.             }
  595.             break;
  596.         case 7:
  597.             list_3.list_union(list_1, list_2);
  598.             cout << "Список 3: ";
  599.             list_3.output();
  600.             cout << endl;
  601.             break;
  602.         case 8:
  603.             list_3.list_intersection(list_1, list_2);
  604.             cout << "Список 3: ";
  605.             list_3.output();
  606.             cout << endl;
  607.             break;
  608.         case 0:
  609.             break;
  610.         }
  611.     } while (q != 0);
  612. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement