Guest User

Untitled

a guest
Oct 28th, 2016
56
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.18 KB | None | 0 0
  1. /*(28) Разработать систему «Линейный список» для работы с линейными односвязными списками. Написать следующие функции:
  2. Инициализация списка
  3. Добавление элемента:
  4. В начало списка
  5. В конец списка
  6. Удаление элемента списка
  7. Вставка элемента в упорядоченный список
  8. Печать списка
  9. Создание списка
  10. Проверка списка на пустоту
  11. Для проверки работы всех функций создать меню выбора функции.
  12. ЛЕК_13 (11.05.16):
  13. (29) Дан линейный односвязный список. Написать программу, которая меняет порядок элементов на обратный без использования второго списка.*/
  14.  
  15. #include <stdio.h>
  16. #include <iostream>
  17. using namespace std;
  18. struct Node
  19. {
  20.     int d;
  21.     Node *next;
  22.     Node *prev;
  23. };
  24. Node *first(int d)//Инициализация списка
  25. {
  26.     Node *pv = new Node;
  27.     pv->d = d; pv->next = NULL; pv->prev = NULL;
  28.     return pv;
  29. }
  30. void add_end(Node **pend, int d)//Добавление в конец списка
  31. {
  32.     Node *pv = new Node;
  33.     pv->d = d; pv->next = NULL; pv->prev = *pend;
  34.     (*pend)->next = pv;
  35.     *pend = pv;
  36. }
  37. void add_beg(Node **pbeg, int d)//Добавление в начало списка
  38. {
  39.     Node *pv = new Node;
  40.     pv->d = d; pv->next = *pbeg; pv->prev = NULL;
  41.     (*pbeg)->prev = pv;
  42.     *pbeg = pv;
  43. }
  44. Node *find(Node *const pbeg, int d)//Поиск элемента по ключу
  45. {
  46.     Node *pv = pbeg;
  47.     while (pv)
  48.     {
  49.         if (pv->d == d)break;
  50.         pv = pv->next;
  51.     }
  52.     return pv;
  53. }
  54. bool remove(Node **pbeg, Node **pend, int key)//Удаление элемента
  55. {
  56.     if (Node *pkey = find(*pbeg, key))
  57.     {
  58.         if (pkey == *pbeg)
  59.         {
  60.             *pbeg = (*pbeg)->next;
  61.             (*pbeg)->prev = NULL;
  62.         }
  63.         else
  64.             if (pkey == *pend)
  65.             {
  66.                 *pend = (*pend)->prev;
  67.                 (*pend)->next = NULL;
  68.             }
  69.             else
  70.             {
  71.                 (pkey->prev)->next = pkey->next;
  72.                 (pkey->next)->prev = pkey->prev;
  73.             }
  74.         delete pkey;
  75.         return true;
  76.     }
  77.     return false;
  78. }
  79. Node *insert(Node *const pbeg, Node **pend, int key, int d)//Вставка элемента в список
  80. {
  81.     if (Node *pkey = find(pbeg, key))
  82.     {
  83.         Node *pv = new Node;
  84.         pv->d = d;
  85.         pv->next = pkey->next;
  86.         pv->prev = pkey;
  87.         pkey->next = pv;
  88.         if (pkey != *pend) (pv->next)->prev = pv;
  89.         else *pend = pv;
  90.         return pv;
  91.     }
  92.     return 0;
  93. }
  94. void insert_list(Node *pbeg,Node *pend, int key)//Вставка в упорядоченный список
  95. {
  96.     Node *pv = pbeg;
  97.     while (pv)
  98.     {
  99.         if (pv->d > key)
  100.         {
  101.             pv = pv->prev;
  102.             break;
  103.         }
  104.         if(pv->next!=NULL)pv = pv->next;
  105.         else break;
  106.     }
  107.     if (pv == pend)add_end(&pend, key);
  108.     else
  109.     {
  110.         Node *new_list = new Node;
  111.         new_list->d = key;
  112.         new_list->prev = pv;
  113.         new_list->next = pv -> next;
  114.         pv->next = new_list;
  115.         (new_list->next)->prev = new_list;
  116.     }
  117. }
  118. void Node_print(Node **pbeg)//Печать списка
  119. {
  120.     Node *pv = *pbeg;
  121.     while (pv)
  122.     {
  123.         cout << pv->d << ' ';
  124.         pv = pv->next;
  125.     }
  126. }
  127. bool check(Node **pbeg)//Проверка списка на пустоту
  128. {
  129.     if (pbeg != NULL)return true;
  130.     else false;
  131. }
  132. Node *create()//Создание и заполнение списка
  133. {
  134.     int n;
  135.     int a;
  136.     cout << "Enter number of elements:\n";
  137.     scanf("%d", &n);
  138.     cout << "Enter element number 1:\n";
  139.     scanf("%d", &a);
  140.     Node *pbeg = first(a);
  141.     Node *pend = pbeg;
  142.     for (int i = 1; i < n; i++)
  143.     {
  144.         cout << "Enter element number ";
  145.         cout <<i;
  146.         cout << ":\n";
  147.         scanf("%d", &a);
  148.         add_end(&pend, a);
  149.     }
  150.     return pbeg;
  151. }
  152. Node *revers(Node **pbeg,Node **pend)//Переворот списка
  153. {
  154.     Node *temp;
  155.     Node *pv = *pbeg;
  156.     while (pv != *pend)
  157.     {
  158.         temp = pv->next;
  159.         pv->next = pv->prev;
  160.         pv->prev = temp;
  161.         pv = temp;
  162.     }
  163.     temp = (*pbeg)->next;
  164.     (*pbeg)->next = NULL;
  165.     (*pbeg)->prev = temp;
  166.     temp = (*pend)->prev;
  167.     (*pend)->prev = NULL;
  168.     (*pend)->next = temp;
  169.     return *pend;
  170. }
  171. int main()
  172. {
  173.     Node *default = first(1);
  174.     Node *pend = default;
  175.     int a = 0;
  176.     int d = 0;
  177.     bool test = true;
  178.     for (int i = 2; i < 10; i++)
  179.     {
  180.         add_end(&pend, i*2);
  181.     }
  182.     int c = 0;
  183.     printf("Menu:\n");
  184.     printf("Enter digit to run function:\n");
  185.     printf("0 - Printing standart List\n");
  186.     printf("1 - List inicialization\n");
  187.     printf("2 - Add to end of List\n");
  188.     printf("3 - Add to begin of List\n");
  189.     printf("4 - Delete element\n");
  190.     printf("5 - Insert element to List\n");
  191.     printf("6 - List creating\n");
  192.     printf("7 - Check is List empty or not\n");
  193.     printf("8 - Turn List\n\n");
  194.     printf("9 - Exit\n");
  195.     while (test)
  196.     {
  197.         scanf("%d", &c);
  198.         switch (c)
  199.         {
  200.         case 0://Печать стандартного списка
  201.         {Node_print(&default); break; }
  202.         case 1://Инициализация списка
  203.         {
  204.             printf("Enter first element:\n");
  205.             scanf("%d", &a);
  206.             Node *one = first(a);
  207.             Node_print(&one);
  208.             break;
  209.         }
  210.         case 2://Добавление в конец
  211.         {
  212.             printf("Enter element:\n");
  213.             scanf("%d", &a);
  214.             add_end(&pend, a);
  215.             Node_print(&default);
  216.             break;
  217.         }
  218.         case 3://В начало
  219.         {
  220.             printf("Enter element:\n");
  221.             scanf("%d", &a);
  222.             add_beg(&default, a);
  223.             Node_print(&default);
  224.             break;
  225.         }
  226.         case 4://Удаление
  227.         {
  228.             printf("Enter element:\n");
  229.             scanf("%d", &a);
  230.             if (remove(&default, &pend, a) == false)
  231.             {
  232.                 printf("Element is not found.\n");
  233.             }
  234.             else Node_print(&default);
  235.             break;
  236.         }
  237.         case 5://Вставка
  238.         {
  239.             printf("Enter element to insert:\n");
  240.             scanf("%d", &a);
  241.             insert_list(default,pend, a);
  242.             Node_print(&default);
  243.             break;
  244.         }
  245.         case 6://Создание списка
  246.         {
  247.             Node *pv = create();
  248.             Node_print(&pv);
  249.             break;
  250.         }
  251.         case 7://Проверка на пустоту
  252.         {
  253.             if (check(&default) != false)printf("List is not empty.\n");
  254.             else ("List is empty.\n");
  255.             break;
  256.         }
  257.         case 8:
  258.         {
  259.             default = revers(&default, &pend);
  260.             Node_print(&default);
  261.             break;
  262.         }
  263.         case 9:
  264.         {
  265.             test = false;
  266.             break;
  267.         }
  268.         }
  269.     }
  270. }
Add Comment
Please, Sign In to add comment