Advertisement
Guest User

Untitled

a guest
Dec 8th, 2019
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.49 KB | None | 0 0
  1. #include <iostream>
  2. #include <random>
  3. using namespace std;
  4.  
  5. struct UZ //структура элемента списка
  6. {
  7.     int num;//число
  8.     UZ *next;//указатель на следующий элемент
  9. };
  10.  
  11. struct List//структура листа
  12. {
  13.     UZ *Head = new UZ;//голова
  14.     int n;//размерность
  15.     List(int n) :n(n)//создание листа
  16.     {
  17.         cout << "Ввод элементов: ";
  18.         int x;
  19.         cin >> x;
  20.         Head->num = x;//ввод значения первого элемента
  21.         Head->next = NULL;
  22.         UZ *Next = Head;
  23.         for (int i = 1; i < n; i++)//в цикле создаём новые элементы, определяем их значения, указываем ссылки друг на друга
  24.         {
  25.             UZ *New = new UZ;
  26.             cin >> x;
  27.             New->next = NULL;
  28.             New->num = x;
  29.            
  30.             //Next->num = x;
  31.             Next->next = New;
  32.             Next = New;
  33.         }
  34.     }
  35.     void print()//Вывод списка с первого элемента, проверяя существование следующего через наличие ссылки
  36.     {
  37.         cout << "Список: ";
  38.         UZ *p;
  39.         bool b = true;
  40.         p = Head;
  41.         do
  42.         {
  43.             if (p == NULL)//если ссылки на след. нет, остановка
  44.                 b = false;
  45.             else { cout << p->num << " "; p = p->next; }//если есть - вывод и переход к следующему
  46.         } while (b);
  47.     }
  48.     void pfirst()
  49.     {
  50.         cout << "Новый элемент в начале: ";
  51.         UZ *First = new UZ;
  52.         cin >> First->num;//создание и ввод нового элемента
  53.         if (n != 0) {//если список не пустой, то ставим его перед головой
  54.             First->next = Head;
  55.             Head = First;
  56.         }
  57.         else
  58.         {
  59.             Head->num = First->num;//если список пуст, то новый элемент теперь голова
  60.             Head->next = NULL;
  61.         }
  62.         n++;
  63.     }
  64.     void plast()
  65.     {
  66.         cout << "Новый элемент в конце: ";
  67.         UZ *Last = new UZ;
  68.         cin >> Last->num;//создание элемента
  69.         Last->next = NULL;
  70.         if (Head->num == NULL)//если список пустой - новый элемент становится головой
  71.             Head = Last;
  72.         else
  73.         {
  74.             UZ *search = Head;
  75.             while (search->next != NULL)//если не пуст, то по ссылкам добираемся до последнего элемента
  76.                 search = search->next;
  77.             search->next = Last;//ставим новый элемент в конец
  78.             n++;
  79.         }
  80.     }
  81.     void mdel()
  82.     {
  83.         cout << "Удаление элемента: ";
  84.         int val;
  85.         cin >> val;//определение какого элемента удаляем
  86.  
  87.         UZ *count = Head;
  88.         int j = 0;
  89.         for (int i = 0; i < n - 1; i++)//считаем сколько элементов надо удалить
  90.         {
  91.             if (count->num == val)
  92.                 j++;
  93.             count = count->next;
  94.         }
  95.         if (count->num == val)
  96.             j++;
  97.         for (int i = 0; i < j; i++) {
  98.             int m = 0;
  99.             UZ *search;
  100.             if (Head->num == val)//удаляемый элемент в начале
  101.             {
  102.                 Head = Head->next;
  103.             }
  104.             else
  105.             {
  106.                 search = Head;
  107.                 while ((search->num != val) && m < n - 1)//поиск следующего для удаления
  108.                 {
  109.                     search = search->next;
  110.                     m++;
  111.                 }
  112.                 UZ *dlt = Head;
  113.                 for (int i = 0; i < m - 1; i++)//удаление элемента
  114.                 {
  115.                     dlt = dlt->next;
  116.                 }
  117.                 dlt->next = search->next;
  118.                 search = dlt;
  119.             }
  120.             n--;
  121.         }
  122.     }
  123.     void delall()
  124.     {
  125.         UZ *hlp = Head;
  126.         for (int i = 1; i < n - 1; i++)//обход всего списка, удаляя всё по ходу
  127.         {
  128.             UZ *hlp1 = hlp->next;
  129.             hlp->next = NULL;
  130.             hlp->num = NULL;
  131.             hlp = hlp1;
  132.         }
  133.         hlp->next = NULL;
  134.         hlp->num = NULL;
  135.         n = 0;
  136.     }
  137. };
  138.  
  139. int main()
  140. {
  141.     cout << "Введите размер списка:\n";
  142.     int n;
  143.     cin >> n;
  144.     List *list = new List(n);
  145.     cout << "[1]Вывод\n[2]Новый элемент в начале\n[3]Новый элемент в конце\n[4]Удаление элемента\n[5]Удаление списка\n[6]Закончить\n";
  146.     int sw;
  147.     bool ch = true;
  148.     while (ch)
  149.     {
  150.         cout << "Выберите действие:\n";
  151.         cin >> sw;
  152.         switch (sw)
  153.         {
  154.         case 1:
  155.         {list->print(); break; }
  156.         case 2:
  157.         {list->pfirst(); break; }
  158.         case 3:
  159.         {list->plast(); break; }
  160.         case 4:
  161.         {list->mdel(); break; }
  162.         case 5:
  163.         {list->delall(); break; }
  164.         case 6:
  165.         {ch = false; break; }
  166.         default:
  167.             break;
  168.         }
  169.     }
  170. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement