Advertisement
Week045

Lab 4.7

May 18th, 2022
125
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.59 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <conio.h>
  4.  
  5. struct student //stack
  6. {
  7.     struct student* nextstud; //указатель на следующий элемент стэка
  8.     char surname[50];
  9. };
  10. struct student_group //circle
  11. {
  12.     struct student_group* nextgr; //указатель на следующий элемент кольца
  13.     struct student* head; //указатель на стэк для данного элемента
  14.     int count;
  15. };
  16.  
  17. void addcircle(struct student_group**);
  18. void deletecircle(struct student_group**);
  19. void showcircle(struct student_group*);
  20. int creationstack(struct student**);
  21. void showstack(struct student*);
  22.  
  23.  
  24. int main()
  25. {
  26.     int k;
  27.     struct student_group* h = NULL;
  28.     while (1)
  29.     {
  30.         rewind(stdin);
  31.         system("CLS");
  32.         puts("Menu");
  33.         puts("1 - Add element of circle");
  34.         puts("2 - Delete element of circle");
  35.         puts("3 - Show elements of circle");
  36.         puts("4 - Return");
  37.         scanf_s("%d", &k);
  38.         switch (k)
  39.         {
  40.         case 1: addcircle(&h); break;
  41.         case 2: deletecircle(&h); break;   
  42.         case 3: showcircle(h); break;
  43.         case 4: return 0;
  44.         default: printf("Error of number");
  45.         }
  46.     }
  47. }
  48.  
  49. void addcircle(struct student_group** h)
  50. {
  51.     struct student_group* s1, *s2;
  52.     if (!(*h))
  53.     {
  54.         if (!(s1 = (struct student_group*)calloc(1, sizeof(struct student_group))))
  55.         {
  56.             printf("Memory error");
  57.             return;
  58.         }
  59.         s1->count = creationstack(&(s1->head));
  60.         printf("Creation of fisrt component is ending\n");
  61.         s1->nextgr = s1;
  62.         *(h) = s1;
  63.     }
  64.     else
  65.     {
  66.         s1 = (*h)->nextgr; //не работает
  67.         while (s1->nextgr != (*h))
  68.             s1 = s1->nextgr;
  69.     }  
  70.     do
  71.     {
  72.         if (!(s2 = (struct student_group*)calloc(1, sizeof(struct student_group))))
  73.         {
  74.             printf("Memory error");
  75.             return;
  76.         }
  77.         s2->count = creationstack(&(s2->head));
  78.         s2->nextgr = s1;
  79.         s1 = s2;
  80.         puts("Do you want to continue(group)?");
  81.         rewind(stdin);
  82.     } while (_getch() == 'y');
  83.     (*h)->nextgr = s2;
  84. }
  85.  
  86. void showcircle(struct student_group* h)
  87. {
  88.     struct student_group* p;
  89.     int i = 0;
  90.     p = h;
  91.     if (!h)
  92.     {
  93.         printf("Circle is empty\n");
  94.         _getch();
  95.         return;
  96.     }
  97.     do
  98.     {
  99.         printf("Number of group: 15050%d\n", ++i);
  100.         printf("Amount of student in this group: %d\n", p->count);
  101.         showstack(p->head);
  102.         p = p->nextgr;
  103.     }
  104.     while (p != h);
  105.     _getch();
  106. }
  107.  
  108. int creationstack(struct student** s)
  109. {
  110.     int count = 0;
  111.     struct student* p = (*s);
  112.     do
  113.     {
  114.         if (!(*s = (struct student*)calloc(1, sizeof(struct student))))
  115.         {
  116.             printf("Memory error\n");
  117.             return 0;
  118.         }
  119.         printf("Write the student surname: ");
  120.         rewind(stdin);
  121.         gets((*s)->surname);
  122.         count++;
  123.         (*s)->nextstud = p;
  124.         p = (*s);
  125.         puts("Do you want to continue(surname)?");
  126.         rewind(stdin);
  127.     } while (_getch() == 'y');
  128.     return count;
  129. }
  130.  
  131. void showstack(struct student* s)
  132. {
  133.     int i = 0;
  134.     if (!s)
  135.     {
  136.         printf("Stack is empty\n");
  137.         return;
  138.     }
  139.     do
  140.     {
  141.         printf("Student #%d: %s\n", ++i, s->surname);
  142.         s = s->nextstud;
  143.     } while (s);
  144.     printf("\n");
  145. }
  146.  
  147. void deletecircle(struct student_group** h)  
  148. {
  149.     struct student_group* p = (*h), * s;
  150.     struct student* s1;
  151.     if (!(*h))
  152.     {
  153.         printf("Circle is empty");
  154.         _getch();
  155.         return;
  156.     }
  157.     if (p->nextgr == (*h))
  158.     {
  159.         s1 = p->head;
  160.         while (s1)
  161.         {
  162.             p->head = s1->nextstud;
  163.             free(s1);
  164.             s1 = p->head;
  165.         }
  166.         free(p);
  167.         printf("Information was deleted\n");
  168.         _getch();
  169.         (*h) = NULL;
  170.         return;
  171.     }
  172.     int countmin = p->count;
  173.     s = p;
  174.     p = p->nextgr;
  175.     while (p != (*h))
  176.     {
  177.         if (p->count < countmin)
  178.         {
  179.             countmin = p->count;
  180.             s = p;
  181.         }
  182.         p = p->nextgr;
  183.     }
  184.     p = s->nextgr; //p в позицию после удаляемого элемента
  185.     s1 = s->head; //s1 - рабочий указатель, который указывает на вершину УДаляемого стэка
  186.     while (s1)
  187.     {
  188.         s->head = s1->nextstud; //вершину УДаляемого стэка перемещаем вниз по стэку
  189.         s1->nextstud = p->head; //теперь s1 - новый элемент НЕудаляемого стэка
  190.         p->head = s1; //перемещаем вершину НЕудаляемого стэка выше на элемент
  191.         s1 = s->head; //рабочий указатель УДаляемого стэка перемещаем на вершину УДаляемого стэка
  192.         (p->count)++;
  193.     }
  194.     p = (*h);
  195.     while (p->nextgr != s) // указатель p становится перед s
  196.         p = p->nextgr;
  197.     if (s == (*h))
  198.     {
  199.         (*h) = s->nextgr;
  200.         p->nextgr = s->nextgr;
  201.         free(s);
  202.     }
  203.     else
  204.     {
  205.         p->nextgr = s->nextgr;
  206.         free(s);
  207.     }
  208.     printf("Information was deleted");
  209.     _getch();
  210. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement