Advertisement
palenda21

Lab13B

May 20th, 2020
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.05 KB | None | 0 0
  1. #include<iostream>
  2. using namespace std;
  3.  
  4. struct comp
  5. {
  6.     int data;
  7.     comp* next;
  8. };
  9.  
  10. comp* addstack(comp* top, int inf)
  11. {
  12.     comp* spt = new comp;
  13.     spt->data = inf;
  14.     spt->next = top;
  15.     return spt;
  16. }
  17.  
  18. int zad(comp* top)
  19. {
  20.      int nn = 0;
  21.         for (int n = 0; top; n++) {
  22.             if (top->data < 0) {
  23.                 nn = n;
  24.                 top = top->next;
  25.             }
  26.             else top = top->next;
  27.         }
  28.         return nn;
  29.     }
  30.  
  31.     void s_print(comp* top) {
  32.         comp* tmp = top;
  33.         while (tmp) {
  34.             cout << tmp->data << ' ';
  35.             tmp = tmp->next;
  36.         }
  37.     }
  38.     void delstack(comp* top) {
  39.         comp* tmp; int data;
  40.         while (top) {
  41.             tmp = top;
  42.             data = top->data;
  43.             cout << data << ' ';
  44.             top = top->next;
  45.             delete tmp;
  46.         }
  47.     }
  48.  
  49. comp* find_max(comp* top)
  50. {
  51.     comp* max=top;
  52.     top=top->next;
  53.     while(top!=NULL)
  54.     {
  55.         if(top->data>max->data){
  56.             max=top;
  57.         }
  58.         top=top->next;
  59.     }
  60.     return max;
  61. }
  62.  
  63.  
  64. comp* find_min(comp* top)
  65. {
  66.     comp* min=top;
  67.     top=top->next;
  68.     while(top!=NULL)
  69.     {
  70.         if(top->data<min->data){
  71.             min=top;
  72.         }
  73.         top=top->next;
  74.     }
  75.     return min;
  76. }
  77.  
  78.  
  79. void change_min_and_max(comp*& main_top)
  80. {
  81.     //проверка если стек пуст
  82.     if(main_top==NULL){
  83.         cout<<"ваш стек пуст! некорректный ввод данных для замены min/max"<<endl;
  84.         return;
  85.     }
  86.    
  87.     //сделаем проверки на то если у нас в стеке //только 1 элемент или все элемента одинаковые
  88.     //так с такими входными данными прога отработае коряво
  89.     if(main_top->next==NULL) {
  90.         cout<<"введите больше чем только один элемент!!!! некорректный ввод данных для замены min/max"<<endl;
  91.         return;
  92.     }
  93.    
  94.     //проверка если в стеке все элементы одинаковые
  95.     bool p=true;
  96.     comp* topp=main_top;
  97.     int element=topp->data;
  98.     while(topp!=NULL)
  99.     {
  100.         if(topp->data!=element)
  101.         {
  102.             p=false;
  103.             break;
  104.         }
  105.         topp=topp->next;
  106.     }
  107.    
  108.     if(p==true){
  109.         cout<<"у вас все элементы одинаковые!!! некорректный ввод данных для замены min/max"<<endl;
  110.         return;
  111.     }
  112.        
  113.    
  114.    
  115.    
  116.     comp* top=main_top;
  117.     comp* min=find_min(top); cout<<"min: "<<min->data<<endl;
  118.     comp* max=find_max(top); cout<<"max: "<<max->data<<endl;
  119.    
  120.     //find before_min // find before_max
  121.     comp* next;
  122.    
  123. //если первый максимальный то меняем main_top на минимальный и идем по стеку до тех пор пока не найдем этот же миниимальный и пересвязываем указатели на максимальный
  124.     if(main_top==max)
  125.     {
  126.         next=top->next;
  127.         max->next=min->next;
  128.         main_top=min;
  129.         min->next=next;
  130.        
  131.         top=main_top->next;
  132.        
  133.         while(top!=max)
  134.         {
  135.             if(top->next==min)
  136.             {
  137.                 top->next=max;
  138.             }
  139.             top=top->next;
  140.            
  141.         }
  142.     }
  143. //делаем тоже самое что и написано выше но уже для минимального  
  144.     else if(main_top==min)
  145.     {
  146.         next=top->next;
  147.         min->next=max->next;
  148.         main_top=max;
  149.         max->next=next;
  150.        
  151.         top=main_top->next;
  152.        
  153.         while(top!=min)
  154.         {
  155.             if(top->next==max)
  156.             {
  157.                 top->next=min;
  158.             }
  159.             top=top->next;
  160.            
  161.         }
  162.     }
  163.    
  164.    
  165.     comp* prev;
  166.     comp* after;
  167. //если первый элемент в стеке не является ни max ни min
  168.     while(top!=NULL)
  169.     {
  170.         if(top->next==max)
  171.         {
  172.             after=min->next;
  173.            
  174.             prev=top;
  175.             next=top->next->next;
  176.            
  177.             prev->next=min;
  178.             min->next=next;
  179.            
  180.             top=top->next;
  181.             //и пока не найдем этот минимальный//когда найдем этот минимальый то пересвяжем указатель на максимальный
  182.             while(top!=max)
  183.             {
  184.                 if(top->next==min)
  185.                 {
  186.                     top->next=max;
  187.                     max=after;
  188.                 }
  189.                 top=top->next;
  190.             }
  191.            
  192.         }
  193. //делаем все тоже самое что и выше но толькр вместо  max у нас min
  194.        
  195.         else if(top->next==min)
  196.         {
  197.             after=max->next;
  198.            
  199.             prev=top;
  200.             next=top->next->next;
  201.            
  202.             prev->next=max;
  203.             max->next=next;
  204.            
  205.             top=top->next;
  206.            
  207.             while(top!=min)
  208.             {
  209.                 if(top->next==max)
  210.                 {
  211.                     top->next=min;
  212.                     min->next=after;
  213.                 }
  214.                 top=top->next;
  215.             }
  216.  
  217.         }
  218.        
  219.         top=top->next;
  220.     }
  221.    
  222. }
  223.  
  224. int main()
  225. {
  226.     setlocale(LC_ALL, "RU");
  227.     comp* top = NULL;
  228.     int n, value;
  229.     cout << "Введите количество элементов стека: ";
  230.     cin >> n;
  231.     cout << "Введите элементы стека: "<<endl;
  232.     for (int i = 0; i < n; i++) {
  233.         cin >> value;
  234.         top = addstack(top, value);
  235.     }
  236.     s_print(top); cout<<endl;
  237.    
  238.     change_min_and_max(top);
  239.     //????
  240.    
  241.     cout<<"after deleting"<<endl;
  242.     s_print(top);
  243.     cout << endl;
  244.     delstack(top);
  245.     return 0;
  246. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement