Savelyev_Vyacheslav

Си все про списки

Dec 30th, 2020 (edited)
210
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 13.98 KB | None | 0 0
  1. //   https://youtu.be/_QLHxI_1yTg
  2.  
  3. #include <iostream>
  4. using namespace std;
  5. class Node
  6. {
  7.     int field;
  8.     class Node *ptr;
  9.     friend class List;
  10. };
  11.  
  12. class List
  13. {
  14.     Node *head;
  15.     int count = 0;
  16.     Node* Prev(Node *); // Переход к предыдущему узлу (не интерфейсный метод)
  17. public:
  18.     List() { head = NULL; } // Инициализация списка
  19.     int getCount() { return count; } // Получение количества узлов списка
  20.     bool isEmpty() { return head == NULL; }  // Проверка, пуст ли список
  21.     int getValue(Node* p) { return p->field; } // Получение значения узла списка
  22.     void setValue(Node *p, int val) { p->field = val; } // Установка значения узла списка
  23.     Node* getFirst() { return head; } // Получение корневого узла списка
  24.     Node* getLast();            // Получение последнего узла списка
  25.     void Clear();               // Очистка списка
  26.     Node* Next(Node *);         // Переход к следующему узлу
  27.     Node* Add(int, Node*);      // Добавление узла списка
  28.     Node* Delete(Node*);        // Удаление узла списка
  29.     void Print();               // Вывод значений узлов списка
  30.     void Swap(Node*, Node*);    // Взаимообмен двух узлов
  31.  
  32.     Node* Nomer_s_kontsa_del(); // удален середина по номеру
  33.     Node* Zamena(); // замена
  34.     Node* Zamena_ptr(); // замена по указателю
  35.  
  36.     Node* Dobav_n_last(); // добавить в конец
  37.     Node* Dobav_pre_last(); // добавить перед конец
  38.     Node* Dobav_head(); // добавить перед конец
  39.     Node* Dobav_head_next(); // добавить перед конец
  40.  
  41.     Node* head_del(); // udalit golovu
  42.     Node* head_next_del(); // udalit 2 s golovu
  43.     Node* Delete_end(); // удаляет конец
  44.     Node* Delete_prev_end(); // удален предпоследний
  45.  
  46.     Node* By_value_del(); // udalit po znacheniu
  47. };
  48.  
  49. Node* List::Add(int num, Node* node = NULL)
  50. {
  51.     Node *elem = new Node();
  52.     elem->field = num;
  53.     count++;
  54.     if (node == NULL) // Добавление нового корня
  55.     {
  56.         if (head == NULL) {
  57.             elem->ptr = NULL;
  58.             head = elem;
  59.         }
  60.         else {
  61.             elem->ptr = head;
  62.             head = elem;
  63.         }
  64.         return elem;
  65.     }
  66.     elem->ptr = node->ptr; // Добавление узла после текущего
  67.     node->ptr = elem;
  68.     return elem;
  69. }
  70.  
  71. Node* List::Delete(Node* node)
  72. {
  73.     if (node == NULL) { return NULL; } // В списке нет узлов
  74.     count--;
  75.     if (node == head)   // Удаление корневого узла
  76.     {
  77.         head = node->ptr;
  78.         delete node;
  79.         return head;
  80.     }
  81.     Node* prev = Prev(node); // Удаление промежуточного узла
  82.     prev->ptr = node->ptr;
  83.     delete node;
  84.     return prev;
  85. }
  86. ////////////////
  87. Node* List::Delete_end()
  88. {
  89.     Node *temp = NULL;
  90.     Node *head2 = head;
  91.     if (head2 == NULL) { return NULL; } // В списке нет узлов
  92.     count--;
  93.     while (head2->ptr != NULL) {  // перемотка на последние указатели
  94.         temp = head2;
  95.         head2 = head2->ptr;
  96.     }
  97.     if (temp) {
  98.         //<udalenie poslednego>
  99.         temp->ptr = NULL;
  100.         delete head2;
  101.         //< /udalenie poslednego>
  102.     }
  103.     cout << temp->field  <<" - " << temp << " - " << temp->ptr << endl;
  104. }
  105. ////////////////
  106. ////////////////
  107. Node* List::Dobav_head()
  108. {
  109.     Node *temp = NULL;
  110.     Node *head2 = head;
  111.     //<opation>
  112.     Node *elem2 = new Node();
  113.     elem2->field = 88;
  114.     elem2->ptr = head2;
  115.     head = elem2;
  116.     //</opation>
  117.     if (head2 == NULL) { return NULL; } // В списке нет узлов
  118.     count++;
  119. }
  120. ////////////////
  121. ////////////////
  122. Node* List::Dobav_head_next()
  123. {
  124.     Node *t1 = NULL;
  125.     Node *t2 = head;
  126.     t1 = head;
  127.     t2 = t2->ptr;
  128.     //<operation>
  129.     Node *elem2 = new Node();
  130.     elem2->field = 88;
  131.     t1->ptr = elem2;
  132.     elem2->ptr = t2;
  133.     //<operation>
  134.     if (t2 == NULL) { return NULL; } // В списке нет узлов
  135.     count++;
  136. }
  137. ////////////////
  138. ////////////////
  139. Node* List::Dobav_n_last()
  140. {
  141.     Node *temp = NULL;
  142.     Node *head2 = head;
  143.     if (head2 == NULL) { return NULL; } // В списке нет узлов
  144.     count++;
  145.     while (head2->ptr != NULL) {
  146.         temp = head2;
  147.         head2 = head2->ptr;
  148.     }
  149.     // <operation>
  150.     Node *elem2 = new Node();
  151.     elem2->field = 88;
  152.     elem2->ptr = NULL;
  153.     head2->ptr = elem2;
  154.     // </operation>
  155.     cout << head2->field << " test " << head2 << " test " << endl;
  156.     cout << head2->ptr->field << " test " << head2->ptr << " test " << endl;
  157. }
  158. ////////////////
  159. /////////////////
  160. Node* List::Dobav_pre_last()
  161. {
  162.     Node *temp = NULL;
  163.     Node *t = head;
  164.     Node *head2 = head;
  165.     if (head2 == NULL) { return NULL; } // В списке нет узлов
  166.     count--;
  167.     while (head2->ptr != NULL) {
  168.     head2 = head2->ptr;
  169.     t = t->ptr;
  170.         if (t->ptr->ptr == NULL) {
  171.         temp = t->ptr;
  172.         cout << t->field << " test2 " << t << " test2 " << endl;
  173.         cout << temp->field << " test2 " << temp->ptr << " test2 " << endl;
  174.         //<operation>
  175.         Node *elem2 = new Node();
  176.         elem2->field = 88;
  177.         t->ptr = elem2;
  178.         elem2->ptr = temp;
  179.         //</operation>
  180.         return NULL;
  181.         }
  182.     }
  183. }
  184. ////////////////
  185. ////////////////
  186. Node* List::Delete_prev_end()
  187. {
  188.     count++;
  189.     Node *temp = NULL;
  190.     Node *head2 = head;
  191.     Node *t = head;
  192.     Node *t2 = head;
  193.     Node *t3 = head;
  194.     if (head2 == NULL) { return NULL; } // В списке нет узлов
  195.     if (head2->ptr == NULL) { return NULL; } // В списке нет узлов по условию
  196.     if (head2->ptr->ptr == NULL) { return NULL; } // В списке нет узлов
  197.     count--;
  198.     int j = 0;
  199.     cout << head2->field << " - " << head2 << " - " << endl;
  200.     while (head2->ptr != NULL) {j++;
  201.                 head2 = head2->ptr;
  202.                 temp = head2;
  203.                 t = temp->ptr;
  204.                 t3 = t->ptr;
  205.         cout << temp->field << " - " << temp << " - " << endl;
  206.         cout << t->field << " - " << t << " - " << endl;
  207.         cout << t3->field << " - " << t3 << " - " << endl;
  208.    
  209.         if (head2->ptr->ptr->ptr == NULL) {
  210.             //// <operation>
  211.             temp->ptr = t3; delete t;
  212.             //// </operation>
  213.             cout << temp->field << " Проверка " << temp << " - " << endl;
  214.             cout << temp->ptr->field << " Проверка " << temp->ptr << " - " << endl;
  215.             cout << "temp->ptr->ptr->field" << " Проверка " << temp->ptr->ptr << " - " << endl;
  216.             cout << "t3->ptr->field" << " - " << t3->ptr << " - " << endl;
  217.             return NULL;
  218.         }
  219.     }
  220. }
  221. ///////////////////
  222. ////////////////
  223. Node* List::Nomer_s_kontsa_del()
  224. {
  225.     count++;
  226.     Node *temp = NULL;
  227.     Node *head2 = head;
  228.     Node *t = head;
  229.     Node *t2 = head;
  230.     Node *t3 = head;
  231.     Node *t4 = head;
  232.     int nomer_s_kontsa = 4;
  233.     if (head2 == NULL) { return NULL;  } // В списке нет узлов
  234.     count--;
  235.     int i = 0;
  236.     int vsego;
  237.     while (t2->ptr != NULL) {
  238.         t2 = t2->ptr;
  239.         i++;
  240.         vsego = i;
  241.     }
  242.     // proverka na sootvetstvie spisku
  243.     if ((vsego+1) <= nomer_s_kontsa) { cout << " Nomer ne sootvetstvuet spisku|" << nomer_s_kontsa << "- этого номера нет " << endl;   return NULL; }
  244.  
  245.     cout << " vsego  " << (vsego+1) << " - " << endl;
  246.     int j = 0;
  247.  
  248.     while (head2->ptr != NULL) {
  249.         if (j == (vsego - nomer_s_kontsa)) {
  250.                 temp = head2;
  251.                 t = temp ->ptr;
  252.                 t3 = t->ptr;
  253.                 //// <perenos ukazatelya udalenie>
  254.                 temp->ptr = t3; delete t;
  255.                 //// </ perenos ukazatelya udalenie>
  256.                 cout << j << " Проверка " << temp << " - " << endl;
  257.                 head2 = head2->ptr;
  258.         }
  259.         else {
  260.             head2 = head2->ptr;
  261.         }
  262.         j++;
  263.     }
  264. }
  265. ///////////////////
  266. ////////////////
  267. Node* List::By_value_del()
  268. {
  269.     Node *temp = NULL;
  270.     Node *head2 = head;
  271.     Node *t = head;
  272.     Node *t2 = head;
  273.     Node *t3 = head;
  274.     Node *t4 = head;
  275.     int value_del = 31;
  276.     if (head2 == NULL) { return NULL; } // В списке нет узлов
  277.     count--;
  278.     int j = 0;
  279.     while (head2->ptr != NULL) {
  280.         temp = head2;
  281.         head2 = head2->ptr;
  282.         if (head2->field == value_del) {
  283.             t = temp->ptr;
  284.             t3 = t->ptr;
  285.             //// <operation>
  286.             temp->ptr = t3; delete t;
  287.             //// </operation>
  288.             cout << j << " Проверка " << temp << " - " << endl;
  289.             break;
  290.         }
  291.         else { 
  292.         }
  293.         j++;
  294.     }
  295. }
  296. ///////////////////
  297. ////////////////
  298. Node* List::head_next_del()
  299. {
  300.     Node *t1 = NULL;
  301.     Node *head2 = head;
  302.     Node *t2 = head;
  303.     Node *t3 = head;
  304.     t1 = head;
  305.     t2 = t1->ptr;
  306.     t3 = t2->ptr;
  307.     if (head2 == NULL) { return NULL; } // В списке нет узлов
  308.     // <ukazateli dlya operatsii>
  309.     cout << t1->field << " - " << t1 << " - " << endl;
  310.     cout << t2->field << " - " << t2 << " - " << endl;
  311.     cout << t3->field << " - " << t3 << " - " << endl;
  312.     // </ukazateli dlya operatsii>
  313.     // <operation>
  314.     t1->ptr = t3;
  315.     t2->ptr = NULL;
  316.     delete t2;
  317.     // </operation>
  318.     // <proverka>
  319.     cout << head2->field << " - " << head2 << " - " << endl;
  320.     cout << head2->ptr->field << " - " << head2->ptr << " - " << endl;
  321.     cout << head2->ptr->ptr->field << " - " << head2->ptr->ptr << " - " << endl;
  322.     // </proverka>
  323. }
  324. ////////////////
  325. ////////////////
  326. Node* List::head_del()
  327. {
  328.     Node *temp = NULL;
  329.     Node *head2 = head;
  330.     Node *t = head;
  331.     if (head2 == NULL) { return NULL; } // В списке нет узлов
  332.     //<operation>
  333.     head = head2->ptr;
  334.     t = NULL;
  335.     delete t;
  336.     //</operation>
  337.     int i = 0;
  338.     while (head2->ptr != NULL) {
  339.         temp = head2;
  340.         head2 = head2->ptr;
  341.         cout << i << " - " << t << " - " << endl;
  342.         cout << i << " - " << temp << " - " << endl;
  343.         cout << i << " - " << head2->ptr << " - " << endl;
  344.         i++;
  345.     }
  346. }
  347. ////////////////
  348. ////////////////
  349. Node* List::Zamena_ptr()
  350. {
  351.     Node *temp = NULL;
  352.     Node *head2 = head;
  353.     Node *t = head;
  354.     Node *t2 = head;
  355.     Node *t3 = head;
  356.     Node *t4 = head;
  357.     if (head2 == NULL) { return NULL; } // В списке нет узлов
  358.     int i = 0;
  359.     int n_zameny=5;
  360.         while (head2->ptr != NULL) {
  361.         t2 = head2;
  362.         head2 = head2->ptr;
  363.         if (i == (n_zameny-2)) {
  364.             temp = head2;
  365.             cout << " Замена " << n_zameny << endl;
  366.             head2 = head2->ptr;
  367.             t3 = temp->ptr;
  368.             // <vivod nuzhnih peremennih>
  369.             cout << t->field << " - " << t << " - " << endl;
  370.             cout << t2->field << " - " << t2 << " - " << endl;
  371.             cout << temp->field << " - " << temp << " - " << endl;
  372.             cout << t3->field << " - " << t3 << " - " << endl;
  373.             // </vivod nuzhnih peremennih>
  374.             // </ podstanovka>
  375.              t4 = t4->ptr;
  376.              t2->ptr = t; t->ptr = t3;
  377.              head = temp;
  378.              temp->ptr = t4;
  379.              // < podstanovka>
  380.              // < proverka>
  381.             cout << head->field << " 1 " << head << " - " << endl;
  382.             cout << t2->field << " n " << t2 << " - " << endl;
  383.             cout << t2->ptr->field << " n+1 " << t2->ptr << " - " << endl;
  384.             cout << t3->field << " n+2 " << t3 << " - " << endl;
  385.             // < proverka>
  386.         }
  387.         i++;
  388.     }  
  389. }
  390. ///////////////////
  391. ////////////////
  392. Node* List::Zamena()
  393. {
  394.     Node *temp = NULL;
  395.     Node *head2 = head;
  396.     Node *t = head;
  397.     if (head2 == NULL) { return NULL; } // В списке нет узлов
  398.     int i = 0;
  399.     int n_zameny;
  400.     cout <<  " Введи номер замены " << endl;
  401.     cin >> n_zameny;
  402.    
  403.     while (head2->ptr != NULL) {
  404.         if (i == (n_zameny-1)) {
  405.             temp = head2;
  406.             cout << " Замена " << n_zameny << endl;
  407.         }
  408.         head2 = head2->ptr;
  409.         cout << i << " - " << t << " - " << endl;
  410.         cout << i << " - " << temp << " - " << endl;
  411.         cout << i << " - " << head2->ptr << " - " << endl;
  412.         i++;
  413.     }  
  414.     if (temp) {
  415.         int zamen1;
  416.         zamen1 = temp->field;
  417.         temp->field = t->field; // вставляем значение первого в выбранный
  418.         t->field = zamen1; // вставляем в первый значение выбранного
  419.     }
  420. }
  421. ///////////////////
  422. void List::Print()
  423. {
  424.     if (isEmpty()) { cout << "Список пуст" << endl; return; }
  425.     Node *p = head;
  426.     do {
  427.         cout << getValue(p) << " ";
  428.         p = Next(p);
  429.     } while (p != NULL);
  430.     cout << endl;
  431. }
  432.  
  433. void List::Clear()
  434. {
  435.     class Node *p = head;
  436.     if (p == NULL) return;
  437.     do {
  438.         Node *d = p;
  439.         p = Next(p);
  440.         delete d;
  441.     } while (p != NULL);
  442.     count = 0;
  443.     head = NULL;
  444. }
  445.  
  446. Node* List::getLast()
  447. {
  448.     Node* p = head;
  449.     while (Next(p) != NULL)
  450.         p = Next(p);
  451.     return p;
  452. }
  453.  
  454. Node* List::Next(Node* node)
  455. {
  456.     if (isEmpty()) return NULL;
  457.     return node->ptr;
  458. }
  459.  
  460. Node* List::Prev(Node* node)
  461. {
  462.     if (isEmpty()) return NULL;
  463.     if (node == head) return NULL;
  464.     Node *p = head;
  465.     while (p->ptr != node)
  466.         p = p->ptr;
  467.     return p;
  468. }
  469.  
  470. void List::Swap(Node* node1, Node* node2)
  471. {
  472.     if (node1 == NULL || node2 == NULL) return;
  473.     if (node1 == node2) return;
  474.     if (node2->ptr == node1)
  475.     {
  476.         Node *p = node1;
  477.         node1 = node2;
  478.         node2 = p;
  479.     }
  480.     Node *prev1 = Prev(node1);
  481.     Node *prev2 = Prev(node2);
  482.     Node *next1 = Next(node1);
  483.     Node *next2 = Next(node2);
  484.     if (next1 == node2)
  485.     {
  486.         if (prev1 != NULL)
  487.             prev1->ptr = node2;
  488.         else
  489.             head = node2;
  490.         node2->ptr = node1;
  491.         node1->ptr = next2;
  492.         return;
  493.     }
  494.     if (prev1 != NULL)
  495.         prev1->ptr = node2;
  496.     else
  497.         head = node2;
  498.     if (prev2 != NULL)
  499.         prev2->ptr = node1;
  500.     else
  501.         head = node1;
  502.     node2->ptr = next1;
  503.     node1->ptr = next2;
  504. }
  505.  
  506.  
  507.  
  508. int main()
  509. {
  510.     system("chcp 1251");
  511.     system("cls");
  512.     List list;
  513.     list.Print();
  514.     Node *s = list.getLast();
  515.     for (int i = 0; i < 10; i++) {
  516.         int z;
  517.         cout << ">> ";
  518.         cin >> z;
  519.         s = list.Add(z, s);
  520.     }
  521.     //list.Delete_end();
  522.     list.Nomer_s_kontsa_del();
  523.     //list.By_value_del();
  524.     //list.Delete_prev_end();
  525.     //list.head_del();
  526.     //list.Zamena();
  527.     //list.Zamena_ptr();
  528.     //list.head_next_del();
  529.     //list.Dobav_n_last();
  530.     //list.Dobav_pre_last();
  531.     //list.Dobav_head();
  532.     //list.Dobav_head_next();
  533.     cout << "***********************" << endl;
  534.     list.Print();
  535.     cout << "Последний элемент: " << list.getValue(list.getLast()) << endl;
  536.     // Удаляем элементы, равные 0
  537.     Node *p = list.getFirst();
  538.     do {
  539.         if (list.getValue(p) == 0)
  540.             p = list.Delete(p);
  541.         else
  542.             p = list.Next(p);
  543.     } while (p != NULL);
  544.     list.Print();
  545.     cout << "В списке " << list.getCount() << " элементов" << endl;
  546.     list.Swap(list.getFirst(), list.getLast());
  547.     list.Print();
  548.     list.Clear();
  549.     list.Print();
  550.     cout << "В списке " << list.getCount() << " элементов" << endl;
  551.     cin.get(); cin.get();
  552.  
  553.     return 0;
  554. }
  555.  
  556.  
Add Comment
Please, Sign In to add comment