Advertisement
coloriot

HA16

Jul 23rd, 2024
27
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.08 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. class List {
  4. private:
  5.     class Node {
  6.     public:
  7.         Node(int val) : value(val), next(nullptr), prev(nullptr) {}
  8.  
  9.         int value;
  10.         Node* next;
  11.         Node* prev;
  12.     };
  13.  
  14.     Node* start;
  15.     Node* finish;
  16.     int size;
  17.  
  18. public:
  19.     // Тут инициализируем
  20.     List() : start(nullptr), finish(nullptr), size(0) {}
  21.  
  22.     // Тут конструктор копирования - его применим внизу
  23.     List(const List& other) : start(nullptr), finish(nullptr), size(0) {
  24.         Node* current = other.start;
  25.         while (current) {
  26.             push_back(current->value);
  27.             current = current->next;
  28.         }
  29.     }
  30.  
  31.     // Деструктор
  32.     ~List() {
  33.         while (size > 0) {
  34.             pop_front();
  35.         }
  36.     }
  37.  
  38.     void push_back(int new_value) {
  39.         Node* new_node = new Node(new_value);
  40.         if (size > 0) {
  41.             finish->next = new_node;
  42.             new_node->prev = finish;
  43.         } else {
  44.             start = new_node;
  45.         }
  46.         finish = new_node;
  47.         ++size;
  48.     }
  49.  
  50.     void push_front(int new_value) {
  51.         Node* new_node = new Node(new_value);
  52.         new_node->next = start;
  53.         if (start != nullptr) {
  54.             start->prev = new_node;
  55.         }
  56.         start = new_node;
  57.         if (size == 0) {
  58.             finish = new_node;
  59.         }
  60.         ++size;
  61.     }
  62.  
  63.     void pop_front() {
  64.         if (size == 0) {
  65.             return;
  66.         }
  67.         Node* old_start = start;
  68.         start = start->next;
  69.         if (start != nullptr) {
  70.             start->prev = nullptr;
  71.         } else {
  72.             finish = nullptr;
  73.         }
  74.         delete old_start;
  75.         --size;
  76.     }
  77.  
  78.     void pop_back() {
  79.         if (size == 0) {
  80.             return;
  81.         }
  82.         Node* old_finish = finish;
  83.         finish = finish->prev;
  84.         if (finish != nullptr) {
  85.             finish->next = nullptr;
  86.         } else {
  87.             start = nullptr;
  88.         }
  89.         delete old_finish;
  90.         --size;
  91.     }
  92.  
  93.     Node* getStart() const { return start; }
  94.     int getSize() const { return size; }
  95.  
  96.     void print() const {
  97.         Node* current = start;
  98.         while (current != nullptr) {
  99.             std::cout << current->value << " ";
  100.             current = current->next;
  101.         }
  102.         std::cout << std::endl;
  103.     }
  104. };
  105.  
  106. int main() {
  107.     // Вводим количество элементов
  108.     int num_elements;
  109.     std::cout << "Количество элементов: ";
  110.     std::cin >> num_elements;
  111.  
  112.     // Вводим элементы
  113.     List list;
  114.     std::cout << "Элементы: ";
  115.     for (int i = 0; i < num_elements; ++i) {
  116.         int value;
  117.         std::cin >> value;
  118.         list.push_back(value);
  119.     }
  120.  
  121.     // Копируем список конструктором копирования
  122.     List copied_list = list;
  123.  
  124.     // Вводим и выполняем команды добавления и удаления элементов
  125.     int n, m, k, l;
  126.     std::cout << "push front: ";
  127.     std::cin >> n;
  128.     list.push_front(n);
  129.  
  130.     std::cout << "push back: ";
  131.     std::cin >> m;
  132.     list.push_back(m);
  133.  
  134.     std::cout << "pop front: ";
  135.     std::cin >> k;
  136.     list.pop_front();
  137.  
  138.     std::cout << "pop back: ";
  139.     std::cin >> l;
  140.     list.pop_back();
  141.  
  142.     // Повторное копирование списка
  143.     List another_copied_list = list;
  144.  
  145.     // Отображение всех трех списков и их адресов в памяти
  146.     std::cout << "Оригинальный список: ";
  147.     copied_list.print();
  148.     std::cout << "Оригинальное место в памяти: " << &copied_list << std::endl;
  149.  
  150.     std::cout << "Список: ";
  151.     list.print();
  152.     std::cout << "Место в памяти: " << &list << std::endl;
  153.  
  154.     std::cout << "Еще один список: ";
  155.     another_copied_list.print();
  156.     std::cout << "Еще одно место в памяти: " << &another_copied_list << std::endl;
  157.  
  158.     return 0;
  159. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement