palenda21

Lab14B

May 25th, 2020
101
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.70 KB | None | 0 0
  1. #include<iostream>
  2. #include<iomanip>
  3. using namespace std;
  4.  
  5. struct double_list
  6. {
  7.     int data;
  8.     double_list* next;
  9.     double_list* prev;
  10. };
  11.  
  12. void push(double_list** head, double_list** tail, int element)
  13. {
  14.     double_list* q = new double_list();
  15.     q->next = NULL;
  16.     q->prev = NULL;
  17.     q->data = element;
  18.     if (*head == NULL)
  19.     {
  20.         *head = *tail = q;
  21.     }
  22.     else
  23.     {
  24.         q->prev = *tail;
  25.         (*tail)->next = q;
  26.         *tail = q;
  27.     }
  28. }
  29.  
  30. void print_from_head_or_tail(double_list* top)
  31. //точка входа выбирается исходя из того что мы передаем/либо хвост/либо голова
  32. {
  33.     if (top != NULL)
  34.     {
  35.         if (top->prev == NULL)
  36.         {
  37.             while (top != NULL)
  38.             {
  39.                 cout << setw(5) << top->data;
  40.                 top = top->next;
  41.             }
  42.             cout << endl;
  43.         }
  44.         else
  45.         {
  46.             while (top != NULL)
  47.             {
  48.                 cout << setw(5) << top->data;
  49.                 top = top->prev;
  50.             }
  51.             cout << endl;
  52.         }
  53.     }
  54. }
  55.  
  56.  
  57.  
  58. void delete_double_list(double_list** head)
  59. {
  60.     double_list* q;
  61.     while (*head != NULL)
  62.     {
  63.         q = *head;
  64.         *head = (*head)->next;
  65.         delete q;
  66.     }
  67. }
  68.  
  69. double_list* find_max(double_list* top,int &max_position)
  70. {
  71.     double_list* max=top;
  72.     top=top->next;
  73.    
  74.     int posititon=0;
  75.     while(top!=NULL)
  76.     {
  77.         posititon++;
  78.         if(top->data>max->data){
  79.             max_position=posititon;
  80.             max=top;
  81.         }
  82.         top=top->next;
  83.     }
  84.     return max;
  85. }
  86.  
  87.  
  88. double_list* find_min(double_list* top,int &min_position)
  89. {
  90.     double_list* min=top;
  91.     top=top->next;
  92.    
  93.     int posititon=0;
  94.     while(top!=NULL)
  95.     {
  96.         posititon++;
  97.         if(top->data<min->data){
  98.             min_position=posititon;
  99.             min=top;
  100.         }
  101.         top=top->next;
  102.     }
  103.     return min;
  104. }
  105.  
  106. void delete_elements(double_list*head,double_list*tail)
  107. {
  108.     //  0( 1 2 3 )4 удаляем то что в скобках
  109.     double_list* q=head->next;
  110.     double_list* top=head->next;
  111.     while(top!=tail)
  112.     {
  113.         q=top;
  114.         top=top->next;
  115.         delete q;
  116.     }
  117.     head->next=tail;
  118.     tail->prev=head;
  119.    
  120. }
  121.  
  122.  
  123. void delete_elements_Between_MAX_MIN(double_list*& top_main)
  124. {
  125.     //проверка если double_list пуст
  126.     if(top_main==NULL){
  127.         cout<<"ваш стек пуст! некорректный ввод данных "<<endl;
  128.         exit(1);
  129.     }
  130.    
  131.     //сделаем проверки на то если у нас в стеке //только 1 элемент или все элемента одинаковые
  132.     //так с такими входными данными прога отработае коряво
  133.     if(top_main->next==NULL) {
  134.         cout<<"введите больше чем только один элемент!!!! некорректный ввод данных "<<endl;
  135.         exit(1);
  136.     }
  137.    
  138.     if(top_main->next->next==NULL){
  139.         cout<<"введите больше чем только 2 элементa!!!! некорректный ввод данных"<<endl;
  140.         exit(1);
  141.     }
  142.    
  143.     int max_position=0, min_position=0;
  144.     double_list* top=top_main;
  145.     double_list* max=find_max(top, max_position);
  146.     double_list* min=find_min(top, min_position);
  147.    
  148.     //проверка если у нас все элементы одинаковые в списке
  149.     if(max->data==min->data){
  150.         cout<<"все элементы одинаковые!//удаление не может быть выполненно!";
  151.         exit(1);
  152.     }
  153.        
  154.    
  155.     int n=max_position-min_position; //смотрим расположение max/min в списке
  156.    
  157.     if(n==1 || n==-1){
  158.         cout<<"между max/min нет элементов";
  159.         exit(0);
  160.     }
  161.     else if(n>1){ // head 5 0 6 7 12 tail  -> next
  162.         delete_elements(min,max);
  163.     }
  164.     else if(n<-1){
  165.         delete_elements(max, min);
  166.     }
  167.    
  168. }
  169.  
  170.  
  171. int main()
  172. {
  173.     double_list* head = NULL;
  174.     double_list* tail = NULL;
  175.    
  176.     int n;
  177.     cout << "Write kolvo of elements: ";
  178.     cin >> n;
  179.     cout << "Elements: ";
  180.     int m;
  181.    
  182.     for (int i = 0; i < n; i++)
  183.     {
  184.         cin >> m;
  185.         push(&head, &tail, m);
  186.     }
  187.    
  188.     print_from_head_or_tail(head);
  189.    
  190.     //передаем только голову//так иначе все пойдем не по плану!
  191.     delete_elements_Between_MAX_MIN(head);
  192.    
  193.      print_from_head_or_tail(head);
  194.    
  195.     delete_double_list(&head);
  196. }
Add Comment
Please, Sign In to add comment