Advertisement
Guest User

Untitled

a guest
Nov 20th, 2019
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 9.75 KB | None | 0 0
  1. #include <iostream>
  2.  
  3. struct Node         //Инициализация списка
  4. {
  5.     int data;       //Присвоение введенного значения элементу
  6.     Node *Next;     //Указатель на следующий элемент
  7.     Node *Prev;     //Указатель на предыдущий элемнт
  8. };
  9.  
  10. class List
  11. {
  12.     Node *Head, *Tail;  //Указатель на адреса начала и конца списка
  13.  
  14. public:
  15.     List(): Head(NULL), Tail(NULL) {}; //Адреса пусты
  16.    
  17.     ~List();                    //Деструктор
  18.     void writeList();           //Вывод списка на экран
  19.     void addElem (int data);    //Добавление элементов по возрастанию
  20.     void isEmpty();             //Проверка на пустоту
  21.     void findMin();             //Поиск минимального элемента
  22.     void delNeed(int elem);             //Удаление заданного
  23.     void addAfterNeed(int elem, int e);        //Добавление после каждого заданного
  24.     void delAfterNeed(int elem);        //Удаление после каждого заданного
  25.     void listSize();
  26.     int n;                      //Размер списка
  27. };
  28.  
  29. List::~List()                   //Деструктор
  30. {
  31.     while (Head) {
  32.         Tail = Head -> Next;
  33.         delete Head;
  34.         Head = Tail;
  35.     }
  36.     n = 0;
  37. }
  38.  
  39. void List::isEmpty()            //Проверка на пустоту
  40. {
  41.     if (Head == NULL) {
  42.         std::cout << "Лист пуст" << std::endl;
  43.     }
  44.     else
  45.         std::cout << "Лист не пуст" << std::endl;
  46. }
  47.  
  48. void List::listSize()          //Размер списка
  49. {
  50.     std::cout << "Размер списка = " << n << std::endl;
  51. }
  52.  
  53. void List::addElem (int data)      //Добавление по возрастанию
  54. {
  55.     Node *p = new Node;
  56.     Node *temp = new Node;
  57.     temp -> Next = NULL;
  58.     temp -> data = data;
  59.     p = Head;
  60.     if (Head != NULL) {
  61.         if (temp -> data <= Head -> data) { //Если добавляемый элемент <= голове
  62.             temp -> Next = Head;
  63.             Head = temp;
  64.             n++;
  65.             return;
  66.         }
  67.        
  68.         if (temp -> data >= Tail -> data) //Если добавляемый элемент >= хвосту
  69.         {
  70.             p = Head;
  71.             int b = 1;
  72.             while (b < n) {
  73.                 p = p -> Next;
  74.                 b++;
  75.             }
  76.             temp -> Next = p -> Next;
  77.             temp -> Prev = p;
  78.             p -> Next = temp;
  79.             Tail  = temp;
  80.         }
  81.        
  82.         if ((temp -> data >= p -> data) and (temp -> data < Tail -> data)) //Если добавляемый элемент >= элементу в списке и < хвоста
  83.         {
  84.             int c = 1;
  85.             p = Head;
  86.             while ((temp -> data >= p -> data) and (p -> Next != NULL))
  87.             {
  88.                 c++;
  89.                 p = p -> Next;
  90.             }
  91.             int count = 1;
  92.             p = Head;
  93.             while (count < c - 1)
  94.             {
  95.                 count++;
  96.                 p = p -> Next;
  97.             }
  98.             temp -> Next = p -> Next;
  99.             p -> Next = temp;
  100.         }
  101.         n++;
  102.     }
  103.     else                        //Если список пустой
  104.     {
  105.         temp -> Prev = NULL;
  106.         Head = Tail = temp;
  107.         n++;
  108.     }
  109. }
  110.  
  111. void List::delNeed(int elem)       //Удаление заданного
  112. {
  113.     Node *p = new Node;
  114.     p = Head;
  115.     if (n == 0)
  116.     {
  117.         std::cout << "Лист пуст" << std::endl;
  118.     } else if (n == 1)
  119.     {
  120.         if (Head -> data == elem)
  121.         {
  122.             delete Head;
  123.             Head = NULL;
  124.             Tail = Head;
  125.             n = 0;
  126.         }
  127.     } else
  128.     {
  129.         while ((Head -> Next != NULL) && (Head -> data == elem))
  130.         {
  131.             p = Head -> Next;
  132.             delete Head;
  133.             Head = p;
  134.             Head -> Prev = NULL;
  135.             n--;
  136.         }
  137.         p = Head;
  138.         while (p -> Next != NULL)
  139.         {
  140.             if (p -> data == elem)
  141.             {
  142.                 p -> Next -> Prev = p -> Prev;
  143.                 p -> Prev -> Next = p -> Next;
  144.                 Node *next = p -> Next;
  145.                 delete p;
  146.                 p = next;
  147.                 n--;
  148.             } else
  149.                 p = p -> Next;
  150.         }
  151.         if (n == 1)
  152.             delNeed(elem);
  153.         else if (Tail -> data == elem)
  154.         {
  155.             p = Tail -> Prev;
  156.             delete Tail;
  157.             n--;
  158.             Tail = p;
  159.         }
  160.     }
  161. }
  162.  
  163. void List::addAfterNeed(int elem, int e)       //Добавление после каждого заданного
  164. {
  165.     Node *p = new Node;
  166.     p = Head;
  167.     if (n == 0)
  168.     {
  169.         std::cout << "Лист пуст" << std::endl;
  170.     }
  171.     else
  172.     {
  173.         while (p -> Next !=NULL)
  174.         {
  175.             if (p -> data == elem)
  176.             {
  177.                 Node *temp = new Node;
  178.                 temp -> data = e;
  179.                 temp -> Next = p -> Next;
  180.                 temp -> Prev = p;
  181.                 p -> Next = temp;
  182.                 temp -> Next -> Prev = temp;
  183.                 n++;
  184.                 p = p-> Next;
  185.            }
  186.            if (p -> Next != NULL)
  187.            {
  188.                p = p -> Next;
  189.            }
  190.         }
  191.        
  192.         if (p -> data == elem)
  193.         {
  194.             Node *temp = new Node;
  195.             temp -> Next = NULL;
  196.             temp -> data = e;
  197.             temp -> Next = p -> Next;
  198.             temp -> Prev = p;
  199.             p -> Next = temp;
  200.             n++;
  201.         }
  202.     }
  203. }
  204.  
  205. void List::delAfterNeed(int elem)       //Удаление после каждого заданного
  206. {
  207.     Node *p = new Node;
  208.     p = Head;
  209.     if (n == 0)
  210.     {
  211.         std::cout << "Лист пуст" << std::endl;
  212.     }
  213.     else
  214.     {
  215.         while (p -> Next !=NULL)
  216.         {
  217.             if (p -> data == elem)
  218.             {
  219.                 Node *h;
  220.                 h = p -> Next;
  221.                 p -> Next = h -> Next;
  222.                 delete h;
  223.                 n--;
  224.             }
  225.             if (p -> Next != NULL)
  226.             {
  227.                 p = p -> Next;
  228.             }
  229.         }
  230.        
  231.         if (p == Tail -> Prev)
  232.         {
  233.             Node *h;
  234.             h = Tail;
  235.             p = h -> Prev;
  236.             p -> Next = NULL;
  237.             Tail = p;
  238.             delete h;
  239.             n--;
  240.         }
  241.     }
  242. }
  243.  
  244. void List::findMin()
  245. {
  246.     if (n != 0)
  247.     {
  248.         int min = 1000000;
  249.         Node *p = new Node;
  250.         p = Head;
  251.         while (p -> Next != NULL)
  252.         {
  253.             if (p -> data < min)
  254.             {
  255.                 min = p -> data;
  256.             }
  257.             p = p -> Next;
  258.         }
  259.         std::cout << "Минимальный элемент = " << min << std::endl;
  260.     }
  261.     else
  262.     {
  263.         std::cout << "Лист пуст" << std::endl;
  264.     }
  265. }
  266.  
  267. void List::writeList()
  268. {
  269.     Node *temp;
  270.     temp = Head;
  271.     while (temp != NULL)
  272.     {
  273.         std::cout << temp -> data << " ";
  274.         temp = temp -> Next;
  275.     }
  276.     if (n == 0)
  277.     {
  278.         std::cout << "Лист пуст";
  279.     }
  280.     std::cout << "\n";
  281. }
  282.  
  283. int main ()
  284. {
  285.     int data;
  286.     int elem;
  287.     int e;
  288.     int x = 1;
  289.     List listElem;
  290.    
  291.     std::cout << "1. Добавление элемента по возрастанию" << std::endl;
  292.     std::cout << "2. Вывод списка" << std::endl;
  293.     std::cout << "3. Добавление элемента после каждого заданного" << std::endl;
  294.     std::cout << "4. Удаление после каждого заданного" << std::endl;
  295.     std::cout << "5. Удаление заданного" << std::endl;
  296.     std::cout << "6. Поиск минимального элемента" << std::endl;
  297.     std::cout << "7. Удаление списка" << std::endl;
  298.     std::cout << "8. Размер списка" << std::endl;
  299.     std::cout << "9. Проверка на пустоту" << std::endl;
  300.     std::cout << "0. Выход из программы" << std::endl;
  301.    
  302.     while (x != 0)
  303.     {
  304.         std::cin >> x;
  305.         switch (x)
  306.         {
  307.             case 1:
  308.                 std::cout << "a = ";
  309.                 std::cin >> data;
  310.                 listElem.addElem(data);
  311.                 break;
  312.             case 2:
  313.                 listElem.writeList();
  314.                 break;
  315.             case 3:
  316.                 std::cout << "Введите число, после которого нужно вставить n ";
  317.                 std::cin >> elem;
  318.                 std::cout << "Введите n ";
  319.                 std::cin >> e;
  320.                 listElem.addAfterNeed(elem, e);
  321.                 break;
  322.             case 4:
  323.                 std::cout << "Введите число, после которого нужно удалить ";
  324.                 std::cin >> elem;
  325.                 listElem.delAfterNeed(elem);
  326.                 break;
  327.             case 5:
  328.                 std::cout << "Введите число, которое нужно удалить ";
  329.                 std::cin >> elem;
  330.                 listElem.delNeed(elem);
  331.                 break;
  332.             case 6:
  333.                 listElem.findMin();
  334.                 break;
  335.             case 7:
  336.                 listElem.~List();
  337.                 break;
  338.             case 8:
  339.                 listElem.listSize();
  340.                 break;
  341.             case 9:
  342.                 listElem.isEmpty();
  343.                 break;
  344.             case 0:
  345.                 ;
  346.         }
  347.     }
  348.     return 0;
  349. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement