Advertisement
coloriot

HA16_V2

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