Advertisement
Week045

Untitled

Sep 11th, 2022
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.25 KB | None | 0 0
  1. // пример работы со стеком
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #include <conio.h>
  5. #include <string.h>
  6. #include <locale.h>
  7.  
  8. struct zap
  9. {
  10.     char inf[50];                   // информациое поле
  11.     zap *l;                         // поле адреса
  12. };
  13. void push(zap **);            
  14. char* pop(zap **);
  15. void show(zap *);
  16. void sort1(zap *);
  17. void sort2(zap **);
  18.  
  19. int main()
  20. {
  21.     setlocale(LC_ALL, "Russian");
  22.     zap *s = nullptr;              // указатель на вершину стека
  23.     char l, ss[50];
  24.     while (1)
  25.     {
  26.         puts("\nвид операции:\n  1-создать/добавить\n  2-удалить");
  27.         puts("  3-просмотреть\n  4-сортировка 1\n  5-сортировка 2");
  28.         puts("  0-кончить");
  29.         fflush(stdin);
  30.         l = getch();
  31.         switch (l)
  32.         {
  33.             case '1': push(&s); break;
  34.             case '2': if(s)
  35.                       {  strcpy(ss, pop(&s));
  36.                          printf("%s", ss);
  37.                       }
  38.                       else puts("стек пуст");
  39.                       break;
  40.             case '3': show(s); break;
  41.             case '4': if (s) sort1(s); break;
  42.             case '5': if (s) sort2(&s); break;
  43.             case '0': return 0;
  44.             default: printf("Ошибка, повторите \n");
  45.         }
  46.     }
  47.     return 0;
  48. }
  49.  
  50. // функция cоздания/добавления в стек
  51. void push(zap **s)
  52. {
  53.     zap *s1 = *s;
  54.     do
  55.     {
  56.         if(!(*s = (zap *)calloc(1, sizeof(zap))))  // указатель на новый элемент стека
  57.         {
  58.             puts("Нет свободной памяти");
  59.             return;
  60.         }
  61.         puts("Введите информацию в поле inf");
  62.         fflush(stdin);
  63.         gets_s((*s)->inf);
  64.         (*s)->l = s1;              // новый эл-т стека "ссылается" на элемент вершину стека
  65.         s1 = *s;                   // новый элемент становится вершиной стека
  66.         puts("Продолжить (y/n)");
  67.         fflush(stdin);
  68.     } while (getch() == 'y');
  69. }
  70.  
  71. // функция просмотра элементов стека
  72. void show(zap *s)
  73. {
  74.     if(!s)
  75.     {
  76.         puts("Стек пуст");
  77.         return;
  78.     }
  79.     do
  80.     {                              
  81.         printf("    %s\n", s->inf);  // вывод информационного поля пекущего эл-та стека
  82.         s = s->l;                    // переход "вниз" к предыдущему эл-ту стека
  83.     } while (s);
  84. }
  85.  
  86. // функция удаления последнего элемента стека
  87. // (с вершины стека)
  88. char* pop(zap **s)
  89. {
  90.     zap *s1, ss;
  91.     //char st[50];
  92.     //strcpy(st, (*s)->inf);  // в st копируется содержимое информ. поля с вершины стека
  93.     s1 = *s;                // запоминаем указатель на вершину стека      
  94.     ss = **s;               // запоминаем содержимое вершины стека
  95.     *s = (*s)->l;           // указатель передвигаем "вниз" по стеку
  96.     free(s1);               // удаляем элемент с вершины стека
  97.     return ss.inf;
  98. }
  99.  
  100. // функция сортировки элементов списка организованного
  101. // в виде перестановкой содержимого элементов стека
  102. void sort1(zap *s)
  103. {
  104.     zap *s1, *s2;
  105.     char inf[50];
  106.     for (; s->l; s = s->l)                // выбор элемента списка к упорядочиванию
  107.     {
  108.         s1 = s;                           // запиминаем адрес выбранного элемента списка
  109.         for (s2 = s->l; s2; s2 = s2->l)   // перебор эл-тов списка "ниже" выбранного
  110.         if (strcmp(s1->inf, s2->inf)>0)   // найден элемент s2 с меньшим значением
  111.             s1 = s2;                      // запоминаем найденный элемент списка
  112.         if (s1 != s)                      // т.е. был найден элемент с меньшим значением
  113.         {                                 // чем выбранный s
  114.             strcpy(inf, s1->inf);         // замена содержимого s <-> s1
  115.             strcpy(s1->inf, s->inf);
  116.             strcpy(s->inf, inf);
  117.         }
  118.     }
  119. }
  120.  
  121. // функция сортировки элементов списка организованного
  122. // в виде стека изменением указателей элементов стека
  123. void sort2(zap **s)
  124. {
  125.     zap *ss, *s1, *s2, *s3, *s4 = NULL;
  126.     ss = (zap *)calloc(1, sizeof(zap));
  127.     ss->l = *s;                              // доп. элемент указывает на вершину стека
  128.     for (; ss->l->l;)                        // цикл ДО последнего эл-та списка
  129.     {
  130.         s1 = ss->l;                          // выбор элемента списка к упорядочиванию
  131.         for (s2 = ss->l; s2->l; s2 = s2->l)  // перебор последующих эл-тов списка ДО последнего
  132.         if (strcmp(s1->inf, s2->l->inf)>0)   // сравнение содержимого двух эл-тов списка
  133.         {                                    // найдено новое меньшее значение
  134.             s1 = s2->l;                      // адрес текущего минимального эл-та
  135.             s3 = s2;                         // адрес элемента перед минимальным
  136.         }
  137.         if (s1 != ss->l)                     // найденный меньший не совпадает с выбранным
  138.         {
  139.             s3->l = s1->l;                   // исключение из списка найденного меньшего
  140.             s1->l = ss->l;                   // меньший "вставляется" перед выбранным
  141.             ss->l = s1;                      // предыдущий перед выбранным указывает на найденный меньший
  142.         }
  143.         if (!s4) s2 = ss;
  144.         ss = ss->l;                         // переход к следующему упорядочиваемому эл-ту
  145.         if (!s4)
  146.         {
  147.             free(s2);                       // удаление дополнительного (временного) элемента
  148.             *s= s4 = s1;                    // новая вершина стека
  149.         }
  150.     }
  151. }
  152.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement