Сортировка стека методом пузырька - C (СИ)
Формулировка задачи:
Привет всем. Народ помогите плиз! Есть программа "сортировка стека" а в конце есть блок где написана сортировка "методом перестановки". Помогите плиз изменить его на "метод пузырька"
#include<stdlib.h>
#include<conio.h>
#include<stdio.h>
#include<math.h>
#define STACK struct stack
STACK {int body;
STACK*next;};
void PUSH(STACK**st);
void ST_LIST(STACK*st);
int POP(STACK**st);
void ST_SORT(STACK**st);
main()
{STACK*st=NULL, *new_st, *old_st, *tmp_st;
int new_body, old_body, choice, tmp_body, ch;
do{
printf("\n Action menu:");
printf("\n1 - PUSH");
printf("\n2 - POP");
printf("\n3 - LIST");
printf("\n4 - SORT");
printf("\n5 - OUT");
printf("\nInput Choice=");
scanf("%d", &choice);
switch(choice)
{case 1: {PUSH(&st); break;};
case 2:{old_body=POP(&st);
printf("\n Body from STACK: %d", old_body);
getch(); break;};
case 3: {ST_LIST(st); getch(); break;};
case 4: {ST_SORT(&st); getch(); break;};
}}
while(choice!=5);
}
void PUSH(STACK**st)
{int new_body;
STACK*new_st=(STACK*)malloc(sizeof(STACK));
if(new_st!=NULL)
{printf("\nInput INT in Stack=");
scanf("%d", &new_body);
new_st->body=new_body;
new_st->next=*st;
*st=new_st;
} printf("%d", new_body);
}
int POP(STACK**st)
{int old_body=32766;
STACK*old_st;
if(*st==NULL)
{printf("\n Stack is EMPTY");}
else{old_st=*st;
old_body=old_st->body;
*st=(*st)->next;
free(old_st);}
return old_body;}
void ST_LIST(STACK*st)
{STACK*tmp_st;
int ch;
if(st==NULL)
{printf("\n Stack is EMPTY");}
else{tmp_st=st;
ch=0;
printf("\n Order Value");
while(tmp_st!=NULL)
{ch=ch+1;
printf("\n %d : %d", ch, tmp_st->body);
tmp_st=tmp_st->next;
}
}
}
void ST_SORT(STACK**st)
{STACK*st1;
STACK*st2;
int tmp;
if(*st==NULL)
{printf("\n Stack is EMPTY");}
else{
st1=*st;
do{st2=st1->next;
while(st2!=NULL){
if(st1->body>st2->body)
{tmp=st1->body;
st1->body=st2->body;
st2->body=tmp;}
st2=st2->next;
}
st1=st1->next;
}while(st1!=NULL);}
}Решение задачи: «Сортировка стека методом пузырька»
textual
Листинг программы
void ST_SORT(STACK**st)
{STACK*st1;
STACK*st2;
int tmp;
if(*st==NULL)
{printf("\n Stack is EMPTY");}
else{
st1=*st;
do{st2=st1->next;
while(st2!=NULL){
if(st1->body>st2->body)
{tmp=st1->body;
st1->body=st2->body;
st2->body=tmp;}
st2=st2->next;
}
st1=st1->next;
}while(st1!=NULL);}
Объяснение кода листинга программы
- Входные данные: указатель на вершину стека
*st. - Проверка: если стек пуст, выводится сообщение об этом.
- Указатель на вершину стека
st1инициализируется значением*st. - В цикле do-while происходит рекурсивный вызов функции
ST_SORTдля всех элементов стека, начиная сst1. - Для каждого вызова функции
ST_SORTинициализируется временная переменнаяst2значениемst1->next. - В цикле while для каждого следующего элемента стека проверяется, больше ли он текущего элемента
st1. - Если текущий элемент
st1больше следующего элемента, выполняется обмен значениями между ними с использованием временной переменнойtmp. - После цикла while для каждого вызова функции
ST_SORTвыполняется переход к следующему элементу стекаst1=st1->next. - После завершения цикла do-while выполняется переход к следующему элементу стека
st1=st1->next. - Результат: отсортированный стек.