PhotoShaman

Односвязный список

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