Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- using namespace std;
- struct comp
- {
- int data;
- comp* next;
- };
- comp* addstack(comp* top, int inf)
- {
- comp* spt = new comp;
- spt->data = inf;
- spt->next = top;
- return spt;
- }
- int zad(comp* top)
- {
- int nn = 0;
- for (int n = 0; top; n++) {
- if (top->data < 0) {
- nn = n;
- top = top->next;
- }
- else top = top->next;
- }
- return nn;
- }
- void s_print(comp* top) {
- comp* tmp = top;
- while (tmp) {
- cout << tmp->data << ' ';
- tmp = tmp->next;
- }
- }
- void delstack(comp* top) {
- comp* tmp; int data;
- while (top) {
- tmp = top;
- data = top->data;
- cout << data << ' ';
- top = top->next;
- delete tmp;
- }
- }
- comp* find_max(comp* top)
- {
- comp* max=top;
- top=top->next;
- while(top!=NULL)
- {
- if(top->data>max->data){
- max=top;
- }
- top=top->next;
- }
- return max;
- }
- comp* find_min(comp* top)
- {
- comp* min=top;
- top=top->next;
- while(top!=NULL)
- {
- if(top->data<min->data){
- min=top;
- }
- top=top->next;
- }
- return min;
- }
- void change_min_and_max(comp*& main_top)
- {
- //проверка если стек пуст
- if(main_top==NULL){
- cout<<"ваш стек пуст! некорректный ввод данных для замены min/max"<<endl;
- return;
- }
- //сделаем проверки на то если у нас в стеке //только 1 элемент или все элемента одинаковые
- //так с такими входными данными прога отработае коряво
- if(main_top->next==NULL) {
- cout<<"введите больше чем только один элемент!!!! некорректный ввод данных для замены min/max"<<endl;
- return;
- }
- //проверка если в стеке все элементы одинаковые
- bool p=true;
- comp* topp=main_top;
- int element=topp->data;
- while(topp!=NULL)
- {
- if(topp->data!=element)
- {
- p=false;
- break;
- }
- topp=topp->next;
- }
- if(p==true){
- cout<<"у вас все элементы одинаковые!!! некорректный ввод данных для замены min/max"<<endl;
- return;
- }
- comp* top=main_top;
- comp* min=find_min(top); cout<<"min: "<<min->data<<endl;
- comp* max=find_max(top); cout<<"max: "<<max->data<<endl;
- //find before_min // find before_max
- comp* next;
- //если первый максимальный то меняем main_top на минимальный и идем по стеку до тех пор пока не найдем этот же миниимальный и пересвязываем указатели на максимальный
- if(main_top==max)
- {
- next=top->next;
- max->next=min->next;
- main_top=min;
- min->next=next;
- top=main_top->next;
- while(top!=max)
- {
- if(top->next==min)
- {
- top->next=max;
- }
- top=top->next;
- }
- }
- //делаем тоже самое что и написано выше но уже для минимального
- else if(main_top==min)
- {
- next=top->next;
- min->next=max->next;
- main_top=max;
- max->next=next;
- top=main_top->next;
- while(top!=min)
- {
- if(top->next==max)
- {
- top->next=min;
- }
- top=top->next;
- }
- }
- comp* prev;
- comp* after;
- //если первый элемент в стеке не является ни max ни min
- while(top!=NULL)
- {
- if(top->next==max)
- {
- after=min->next;
- prev=top;
- next=top->next->next;
- prev->next=min;
- min->next=next;
- top=top->next;
- //и пока не найдем этот минимальный//когда найдем этот минимальый то пересвяжем указатель на максимальный
- while(top!=max)
- {
- if(top->next==min)
- {
- top->next=max;
- max=after;
- }
- top=top->next;
- }
- }
- //делаем все тоже самое что и выше но толькр вместо max у нас min
- else if(top->next==min)
- {
- after=max->next;
- prev=top;
- next=top->next->next;
- prev->next=max;
- max->next=next;
- top=top->next;
- while(top!=min)
- {
- if(top->next==max)
- {
- top->next=min;
- min->next=after;
- }
- top=top->next;
- }
- }
- top=top->next;
- }
- }
- int main()
- {
- setlocale(LC_ALL, "RU");
- comp* top = NULL;
- int n, value;
- cout << "Введите количество элементов стека: ";
- cin >> n;
- cout << "Введите элементы стека: "<<endl;
- for (int i = 0; i < n; i++) {
- cin >> value;
- top = addstack(top, value);
- }
- s_print(top); cout<<endl;
- change_min_and_max(top);
- //????
- cout<<"after deleting"<<endl;
- s_print(top);
- cout << endl;
- delstack(top);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement