Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- Страница 125, номер 23:
- Разработать шаблон списка, реализовав групповые добавления, удаление и замену элементов.
- Группа представляется диапазоном итераторов.
- Реализовать методы поиска элементов и групп элементов.
- Добавить методы комбинирования списков как объединение и пересечение множеств.
- */
- #include <iostream>
- #include <Windows.h>
- using namespace std;
- template <typename T>
- class List
- {
- template <typename T>
- struct Node
- {
- T value;
- Node<T>* pNext;
- Node(T value = T(), Node<T>* pNext = nullptr)
- {
- this->value = value;
- this->pNext = pNext;
- }
- };
- Node<T> *head;
- int size;
- public:
- class iterator;
- List();
- List(T);
- void initial(T);
- void add_one(int, iterator);
- void add_group(iterator, int, T);
- void del_one(iterator);
- void del_group(iterator, iterator);
- void rep_group(iterator, iterator);
- bool is_empty();
- int search_value(T);
- void list_union(List<T>, List<T>);
- void list_intersection(List<T>, List<T>);
- iterator begin() const
- {
- return iterator(head);
- }
- iterator end() const
- {
- Node<T>* it = head;
- for (int i = 0; i < size; i++)
- it = it->pNext;
- return iterator(it);
- }
- void output()
- {
- for (iterator it(begin()); it != end(); it++)
- {
- cout << *it << ' ';
- }
- }
- int size_out()
- {
- return size;
- }
- };
- template <typename T>
- class List<T>::iterator
- {
- Node<T>* elem;
- public:
- iterator(Node<T>* node)
- {
- elem = node;
- }
- bool operator==(const iterator& it)
- {
- return elem == it.elem;
- }
- bool operator!=(const iterator& it)
- {
- return !(*this == it);
- }
- iterator operator++()
- {
- elem = elem->pNext;
- return *this;
- }
- iterator operator++(int)
- {
- iterator tmp = *this;
- elem = elem->pNext;
- return tmp;
- }
- iterator operator+=(int size)
- {
- for (int i = 0; i < size; i++)
- elem = elem->pNext;
- return *this;
- }
- T& operator*()
- {
- return elem->value;
- }
- };
- //конструкторы
- template <typename T>
- List<T>::List()
- {
- head = nullptr;
- size = 0;
- }
- template <typename T>
- List<T>::List(T value)
- {
- head = new Node<T>(value);
- size = 1;
- }
- //добавление
- template <typename T>
- void List<T>::initial(T value)
- {
- head = new Node<T>;
- head->value = value;
- size++;
- }
- template <typename T>
- void List<T>::add_one(int elem, iterator it)
- {
- Node<T>* tmp = head;
- Node<T>* new_node = new Node<T>(elem);
- if (!is_empty())
- {
- for (iterator it_tmp(begin()); it_tmp != it && tmp->pNext != nullptr; it_tmp++)
- tmp = tmp->pNext;
- new_node->pNext = tmp->pNext;
- tmp->pNext = new_node;
- size++;
- }
- else
- {
- head = new Node<T>(elem);
- head->pNext = nullptr;
- size++;
- }
- }
- template <typename T>
- void List<T>::add_group(iterator it_begin, int n, T value)
- {
- iterator it_tmp(it_begin);
- for (int i = 0; i < n; it_tmp++, i++)
- {
- this->add_one(value, it_tmp);
- if (it_tmp == nullptr)
- it_tmp = begin();
- }
- }
- //удаление
- template <typename T>
- void List<T>::del_one(iterator it)
- {
- if (!is_empty())
- {
- if (it != begin())
- {
- iterator it_tmp(begin());
- Node<T>* tmp = head;
- Node<T>* tmp2 = head;
- for (; it_tmp != it; it_tmp++)
- {
- tmp = tmp->pNext;
- }
- while (tmp2->pNext != tmp)
- {
- tmp2 = tmp2->pNext;
- }
- Node<T>* old_node = tmp;
- tmp2->pNext = old_node->pNext;
- delete[]old_node;
- }
- else if (head->pNext != nullptr)
- {
- Node<T>* old_node = head;
- head = head->pNext;
- it = head;
- delete[] old_node;
- }
- else
- {
- delete[]head;
- it = nullptr;
- }
- size--;
- }
- else cout << "Список пуст" << endl;
- }
- template <typename T>
- void List<T>::del_group(iterator it_begin, iterator it_end)
- {
- iterator it_tmp(it_begin);
- iterator it_tmp2(it_begin);
- while (it_tmp != it_end)
- {
- it_tmp2++;
- this->del_one(it_tmp);
- it_tmp = it_tmp2;
- }
- }
- //замена
- template <typename T>
- void List<T>::rep_group(iterator it_begin, iterator it_end)
- {
- T elem;
- Node<T> *tmp = head;
- iterator it_tmp2(begin());
- while (it_tmp2 != it_begin)
- {
- it_tmp2++;
- tmp = tmp->pNext;
- }
- for (iterator it_tmp(it_begin); it_tmp != it_end; it_tmp++, tmp = tmp->pNext)
- {
- cin >> elem;
- tmp->value = elem;
- }
- }
- //проверка на пустоту
- template <typename T>
- bool List<T>::is_empty()
- {
- return size == 0;
- }
- //поиск элемента
- template <typename T>
- int List<T>::search_value(T value)
- {
- Node<T>* it = head;
- int count = 0;
- while (it != nullptr)
- {
- if (it->value == value)
- return count;
- it = it->pNext;
- count++;
- }
- return -1;
- }
- //объединение и пересечение
- template <typename T>
- void List<T>::list_union(List<T> list_1, List<T> list_2)
- {
- iterator it_begin(list_1.begin());
- iterator it_end(list_1.end());
- iterator it_tmp(list_1.begin());
- iterator it_tmp2(begin());
- for (; it_tmp != it_end; it_tmp++, it_tmp2++)
- {
- this->add_one(*it_tmp, it_tmp2);
- if (it_tmp2 == nullptr)
- it_tmp2 = begin();
- }
- it_begin = list_2.begin();
- it_end = list_2.end();
- it_tmp = list_2.begin();
- for (; it_tmp != it_end; it_tmp++, it_tmp2++)
- {
- this->add_one(*it_tmp, it_tmp2);
- if (it_tmp2 == nullptr)
- it_tmp2 = begin();
- }
- }
- template <typename T>
- void List<T>::list_intersection(List<T> list_1, List<T> list_2)
- {
- iterator it_begin1(list_1.begin());
- iterator it_end1(list_1.end());
- iterator it_begin2(list_2.begin());
- iterator it_end2(list_2.end());
- iterator it_tmp(list_1.begin());
- iterator it_tmp2(list_2.begin());
- iterator it_tmp3(begin());
- bool repeat = false;
- for (; it_tmp != it_end1; it_tmp++)
- {
- for (it_tmp2 = list_2.begin(), repeat = false; it_tmp2 != it_end2 && repeat == false; it_tmp2++)
- {
- if (*it_tmp == *it_tmp2)
- {
- this->add_one(*it_tmp, it_tmp3);
- if (it_tmp3 == nullptr)
- it_tmp3 = begin();
- it_tmp3++;
- repeat = true;
- }
- }
- }
- }
- int main()
- {
- SetConsoleOutputCP(1251);
- SetConsoleCP(1251);
- int q;
- List<int> list_1;
- List<int> list_2;
- List<int> list_3;
- int tmp;
- int n = 0;
- List<int>::iterator it(list_1.begin());
- List<int>::iterator it2(list_1.begin());
- int size = 0;
- do
- {
- cout << "Выберите действие:" << endl;
- cout << "1. Добавить элемент в список" << endl;
- cout << "2. Добавить группу элементов в список" << endl;
- cout << "3. Удалить элемент из списка" << endl;
- cout << "4. Удалить группу элементов из списка" << endl;
- cout << "5. Вывести список" << endl;
- cout << "6. Найти элемент" << endl;
- cout << "7. Объединение двух списков" << endl;
- cout << "8. Пересечение двух списков" << endl;
- cout << "0. Выход" << endl;
- cin >> q;
- switch (q)
- {
- case 1:
- cout << "1. Добавить элемент в список 1" << endl;
- cout << "2. Добавить элемент в список 2" << endl;
- cin >> q;
- switch (q)
- {
- case 1:
- cout << "Введите место вставки элемента:" << endl;
- cin >> tmp;
- size = list_1.size_out();
- while (tmp >= size)
- {
- cout << "Место должно находиться в списке" << endl;
- cout << "Введите место вставки элемента:" << endl;
- cin >> tmp;
- }
- it = list_1.begin();
- it += tmp;
- cout << "Введите значение элемента:" << endl;
- cin >> tmp;
- list_1.add_one(tmp, it);
- break;
- case 2:
- cout << "Введите место вставки элемента:" << endl;
- cin >> tmp;
- size = list_2.size_out();
- while (tmp >= size)
- {
- cout << "Место должно находиться в списке" << endl;
- cout << "Введите место вставки элемента:" << endl;
- cin >> tmp;
- }
- it = list_2.begin();
- it += tmp;
- cout << "Введите значение элемента:" << endl;
- cin >> tmp;
- list_2.add_one(tmp, it);
- break;
- }
- break;
- case 2:
- cout << "1. Добавить группу элементов в список 1" << endl;
- cout << "2. Добавить группу элементов в список 2" << endl;
- cin >> q;
- switch (q)
- {
- case 1:
- cout << "Введите место вставки элемента:" << endl;
- cin >> tmp;
- size = list_1.size_out();
- while (tmp >= size)
- {
- cout << "Место должно находиться в списке" << endl;
- cout << "Введите место вставки элемента:" << endl;
- cin >> tmp;
- }
- it = list_1.begin();
- it += tmp;
- cout << "Введите количество элементов:" << endl;
- cin >> n;
- cout << "Введите значение элемента:" << endl;
- cin >> tmp;
- list_1.add_group(it, n, tmp);
- break;
- case 2:
- cout << "Введите место вставки элемента:" << endl;
- cin >> tmp;
- size = list_2.size_out();
- while (tmp >= size)
- {
- cout << "Место должно находиться в списке" << endl;
- cout << "Введите место вставки элемента:" << endl;
- cin >> tmp;
- }
- it = list_2.begin();
- it += tmp;
- cout << "Введите количество элементов:" << endl;
- cin >> n;
- cout << "Введите значение элемента:" << endl;
- cin >> tmp;
- list_2.add_group(it, n, tmp);
- break;
- }
- break;
- case 3:
- cout << "1. Удалить элемент из списка 1" << endl;
- cout << "2. Удалить элемент из списка 2" << endl;
- cin >> q;
- switch (q)
- {
- case 1:
- cout << "Введите место удаляемого элемента:" << endl;
- cin >> tmp;
- size = list_1.size_out();
- while (tmp >= size)
- {
- cout << "Место должно находиться в списке" << endl;
- cout << "Введите место вставки элемента:" << endl;
- cin >> tmp;
- }
- it = list_1.begin();
- it += tmp;
- list_1.del_one(it);
- break;
- case 2:
- cout << "Введите место удаляемого элемента:" << endl;
- cin >> tmp;
- size = list_2.size_out();
- while (tmp >= size)
- {
- cout << "Место должно находиться в списке" << endl;
- cout << "Введите место вставки элемента:" << endl;
- cin >> tmp;
- }
- it = list_2.begin();
- it += tmp;
- list_2.del_one(it);
- break;
- }
- break;
- case 4:
- cout << "1. Удалить группу элементов из списка 1" << endl;
- cout << "2. Удалить группу элементов из списка 2" << endl;
- cin >> q;
- switch (q)
- {
- case 1:
- cout << "Введите начало диапазона удаления:" << endl;
- cin >> tmp;
- size = list_1.size_out();
- while (tmp >= size)
- {
- cout << "Место должно находиться в списке" << endl;
- cout << "Введите место вставки элемента:" << endl;
- cin >> tmp;
- }
- it = list_1.begin();
- it += tmp;
- cout << "Введите конец диапазона удаления:" << endl;
- cin >> tmp;
- size = list_1.size_out();
- while (tmp >= size)
- {
- cout << "Место должно находиться в списке" << endl;
- cout << "Введите место вставки элемента:" << endl;
- cin >> tmp;
- }
- it2 = list_1.begin();
- it2 += tmp;
- list_1.del_group(it, it2);
- break;
- case 2:
- cout << "Введите начало диапазона удаления:" << endl;
- cin >> tmp;
- size = list_2.size_out();
- while (tmp >= size)
- {
- cout << "Место должно находиться в списке" << endl;
- cout << "Введите место вставки элемента:" << endl;
- cin >> tmp;
- }
- it = list_2.begin();
- it += tmp;
- cout << "Введите конец диапазона удаления:" << endl;
- cin >> tmp;
- size = list_2.size_out();
- while (tmp >= size)
- {
- cout << "Место должно находиться в списке" << endl;
- cout << "Введите место вставки элемента:" << endl;
- cin >> tmp;
- }
- it2 = list_2.begin();
- it2 += tmp;
- list_2.del_group(it, it2);
- break;
- }
- break;
- case 5:
- cout << "1. Вывести список 1" << endl;
- cout << "2. Вывести список 2" << endl;
- cin >> q;
- switch (q)
- {
- case 1:
- cout << "Список 1: ";
- list_1.output();
- cout << endl;
- break;
- case 2:
- cout << "Список 2: ";
- list_2.output();
- cout << endl;
- break;
- }
- break;
- case 6:
- cout << "1. Поиск в списке 1" << endl;
- cout << "2. Поиск в списке 2" << endl;
- cin >> q;
- switch (q)
- {
- case 1:
- cout << "Введите значение элемента:" << endl;
- cin >> tmp;
- if (list_1.search_value(tmp) == -1)
- cout << "Такого элемента нет в списке" << endl;
- else cout << "Номер элемента: " << list_1.search_value(tmp) << endl;
- break;
- case 2:
- cout << "Введите значение элемента:" << endl;
- cin >> tmp;
- if (list_2.search_value(tmp) == -1)
- cout << "Такого элемента нет в списке" << endl;
- else cout << "Номер элемента: " << list_2.search_value(tmp) << endl;
- break;
- }
- break;
- case 7:
- list_3.list_union(list_1, list_2);
- cout << "Список 3: ";
- list_3.output();
- cout << endl;
- break;
- case 8:
- list_3.list_intersection(list_1, list_2);
- cout << "Список 3: ";
- list_3.output();
- cout << endl;
- break;
- case 0:
- break;
- }
- } while (q != 0);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement