Advertisement
Savelyev_Vyacheslav

Viktor_bro

Dec 23rd, 2020 (edited)
244
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.96 KB | None | 0 0
  1. #include <iostream>
  2. using namespace std;
  3. class Node
  4. {
  5.     int field;
  6.     class Node *ptr;
  7.     friend class List;
  8. };
  9.  
  10. class List
  11. {
  12.     Node *head;
  13.     int count = 0;
  14.     Node* Prev(Node *); // Переход к предыдущему узлу (не интерфейсный метод)
  15. public:
  16.     List() { head = NULL; } // Инициализация списка
  17.     int getCount() { return count; } // Получение количества узлов списка
  18.     bool isEmpty() { return head == NULL; }  // Проверка, пуст ли список
  19.     int getValue(Node* p) { return p->field; } // Получение значения узла списка
  20.     void setValue(Node *p, int val) { p->field = val; } // Установка значения узла списка
  21.     Node* getFirst() { return head; } // Получение корневого узла списка
  22.     Node* getLast();            // Получение последнего узла списка
  23.     void Clear();               // Очистка списка
  24.     Node* Next(Node *);         // Переход к следующему узлу
  25.     Node* Add(int, Node*);      // Добавление узла списка
  26.     Node* Delete(Node*);        // Удаление узла списка
  27.     void Print();               // Вывод значений узлов списка
  28.     void Swap(Node*, Node*);    // Взаимообмен двух узлов
  29.     Node* Delete_end(); // удаляет конец
  30.     Node* Dobav_konets_new(); // добавить в конец
  31.     Node* Zamena(); // замена
  32. };
  33.  
  34. Node* List::Add(int num, Node* node = NULL)
  35. {
  36.     Node *elem = new Node();
  37.     elem->field = num;
  38.     count++;
  39.     if (node == NULL) // Добавление нового корня
  40.     {
  41.         if (head == NULL) {
  42.             elem->ptr = NULL;
  43.             head = elem;
  44.         }
  45.         else {
  46.             elem->ptr = head;
  47.             head = elem;
  48.         }
  49.         return elem;
  50.     }
  51.     elem->ptr = node->ptr; // Добавление узла после текущего
  52.     node->ptr = elem;
  53.     return elem;
  54. }
  55.  
  56. Node* List::Delete(Node* node)
  57. {
  58.     if (node == NULL) { return NULL; } // В списке нет узлов
  59.     count--;
  60.     if (node == head)   // Удаление корневого узла
  61.     {
  62.         head = node->ptr;
  63.         delete node;
  64.         return head;
  65.     }
  66.     Node* prev = Prev(node); // Удаление промежуточного узла
  67.     prev->ptr = node->ptr;
  68.     delete node;
  69.     return prev;
  70. }
  71. ////////////////
  72. Node* List::Delete_end()
  73. {
  74.     Node *temp = NULL;
  75.     Node *head2 = head;
  76.     if (head2 == NULL) { return NULL; } // В списке нет узлов
  77.     count--;
  78.  
  79.     while (head2->ptr != NULL) {
  80.         temp = head2;
  81.         head2 = head2->ptr;
  82.     }
  83.     if (temp) {
  84.         temp->ptr = NULL;
  85.     }
  86.  
  87.     delete head2;
  88.  
  89. }
  90. ///////////////////
  91. ////////////////
  92. Node* List::Dobav_konets_new()
  93. {
  94.     Node *elem2 = new Node();
  95.     elem2->field = 88;
  96.     cout << " field-  " << elem2->field << " - " << endl;
  97.     count++;
  98.     Node *temp = NULL;
  99.     Node *head2 = head;
  100.     Node *t = head;
  101.  
  102.     if (head2 == NULL) { return NULL; } // В списке нет узлов
  103.     count--;
  104.     int i = 0;
  105.     while (head2->ptr != NULL) {
  106.         temp = head2;
  107.         head2 = head2->ptr;
  108.         cout << i << " - " << t << " - " << endl;
  109.         cout << i << " - " << temp << " - " << endl;
  110.         cout << i << " - " << head2->ptr << " - " << endl;
  111.         i++;
  112.     }   if (temp) {
  113.         head2->ptr = elem2;
  114.         elem2->ptr = NULL;
  115.     }
  116. }
  117. ///////////////////
  118. ////////////////
  119. Node* List::head_del()
  120. {
  121.  
  122.     Node *temp = NULL;
  123.     Node *head2 = head;
  124.     Node *t = head;
  125.     head = head2->ptr;
  126.     t = NULL;
  127.     delete t;
  128.  
  129.     if (head2 == NULL) { return NULL; } // В списке нет узлов
  130.  
  131.     int i = 0;
  132.     while (head2->ptr != NULL) {
  133.         temp = head2;
  134.         head2 = head2->ptr;
  135.         cout << i << " - " << t << " - " << endl;
  136.         cout << i << " - " << temp << " - " << endl;
  137.         cout << i << " - " << head2->ptr << " - " << endl;
  138.         i++;
  139.     }
  140.     //if (temp) {
  141.     //  head2->ptr = elem2;
  142.     //  elem2->ptr = NULL;
  143.     //}
  144. }
  145. /////////////////////////////////////////
  146. ////////////////
  147. Node* List::Zamena()
  148. {
  149.     Node *temp = NULL;
  150.     Node *head2 = head;
  151.     Node *t = head;
  152.     if (head2 == NULL) { return NULL; } // В списке нет узлов
  153.     int i = 0;
  154.     int n_zameny = 2;
  155.     while (head2->ptr != NULL) {
  156.         if (i = (n_zameny-1)) {
  157.             temp = head2;
  158.         }
  159.         head2 = head2->ptr;
  160.         cout << i << " - " << t << " - " << endl;
  161.         cout << i << " - " << temp << " - " << endl;
  162.         cout << i << " - " << head2->ptr << " - " << endl;
  163.         i++;
  164.     }  
  165.     if (temp) {
  166.         int zamen1;
  167.         int zamen2;
  168.         zamen1 = t->field;
  169.         zamen2 = temp->field;
  170.         temp->field = t->field; // вставляем значение первого в выбранный
  171.         t->field = zamen2; // вставляем в первый значение выбранного
  172.     }
  173. }
  174. ///////////////////
  175. void List::Print()
  176. {
  177.     if (isEmpty()) { cout << "Список пуст" << endl; return; }
  178.     Node *p = head;
  179.     do {
  180.         cout << getValue(p) << " ";
  181.         p = Next(p);
  182.     } while (p != NULL);
  183.     cout << endl;
  184. }
  185.  
  186. void List::Clear()
  187. {
  188.     class Node *p = head;
  189.     if (p == NULL) return;
  190.     do {
  191.         Node *d = p;
  192.         p = Next(p);
  193.         delete d;
  194.     } while (p != NULL);
  195.     count = 0;
  196.     head = NULL;
  197. }
  198.  
  199. Node* List::getLast()
  200. {
  201.     Node* p = head;
  202.     while (Next(p) != NULL)
  203.         p = Next(p);
  204.     return p;
  205. }
  206.  
  207. Node* List::Next(Node* node)
  208. {
  209.     if (isEmpty()) return NULL;
  210.     return node->ptr;
  211. }
  212.  
  213. Node* List::Prev(Node* node)
  214. {
  215.     if (isEmpty()) return NULL;
  216.     if (node == head) return NULL;
  217.     Node *p = head;
  218.     while (p->ptr != node)
  219.         p = p->ptr;
  220.     return p;
  221. }
  222.  
  223. void List::Swap(Node* node1, Node* node2)
  224. {
  225.     if (node1 == NULL || node2 == NULL) return;
  226.     if (node1 == node2) return;
  227.     if (node2->ptr == node1)
  228.     {
  229.         Node *p = node1;
  230.         node1 = node2;
  231.         node2 = p;
  232.     }
  233.     Node *prev1 = Prev(node1);
  234.     Node *prev2 = Prev(node2);
  235.     Node *next1 = Next(node1);
  236.     Node *next2 = Next(node2);
  237.     if (next1 == node2)
  238.     {
  239.         if (prev1 != NULL)
  240.             prev1->ptr = node2;
  241.         else
  242.             head = node2;
  243.         node2->ptr = node1;
  244.         node1->ptr = next2;
  245.         return;
  246.     }
  247.     if (prev1 != NULL)
  248.         prev1->ptr = node2;
  249.     else
  250.         head = node2;
  251.     if (prev2 != NULL)
  252.         prev2->ptr = node1;
  253.     else
  254.         head = node1;
  255.     node2->ptr = next1;
  256.     node1->ptr = next2;
  257. }
  258.  
  259.  
  260.  
  261. int main()
  262. {
  263.     system("chcp 1251");
  264.     system("cls");
  265.     List list;
  266.     list.Print();
  267.     Node *s = list.getLast();
  268.     for (int i = 0; i < 10; i++) {
  269.         int z;
  270.         cout << ">> ";
  271.         cin >> z;
  272.         s = list.Add(z, s);
  273.     }
  274.     // list.Delete_end();
  275.     // list.Dobav_konets_new();
  276.     //list.head_del();
  277.     list.Zamena();
  278.     cout << "***********************" << endl;
  279.     list.Print();
  280.     cout << "Последний элемент: " << list.getValue(list.getLast()) << endl;
  281.     // Удаляем элементы, равные 0
  282.     Node *p = list.getFirst();
  283.     do {
  284.         if (list.getValue(p) == 0)
  285.             p = list.Delete(p);
  286.         else
  287.             p = list.Next(p);
  288.     } while (p != NULL);
  289.     list.Print();
  290.     cout << "В списке " << list.getCount() << " элементов" << endl;
  291.     list.Swap(list.getFirst(), list.getLast());
  292.     list.Print();
  293.     list.Clear();
  294.     list.Print();
  295.     cout << "В списке " << list.getCount() << " элементов" << endl;
  296.     cin.get(); cin.get();
  297.  
  298.     return 0;
  299. }
  300.  
  301.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement