Сортировка стека методом пузырька - 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
. - Результат: отсортированный стек.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д