Advertisement
P1punGorbach

KURSACH

Mar 13th, 2023
672
0
Never
1
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 11.06 KB | None | 0 0
  1. //кольцевой односвязный список векторов целого типа на односвязном списке
  2.  
  3.  
  4. #include <iostream>
  5. #include <stdio.h>
  6. #include <string.h>
  7. #include <stdlib.h>
  8.  
  9. using namespace std;
  10.  
  11. struct Node {
  12.     int value;
  13.     struct Node* next;
  14. };
  15.  
  16. struct Vec {
  17.     struct Node* first = NULL; 
  18.     int counter = 0;
  19. };
  20. struct ListNode {
  21.     Vec value;
  22.     struct ListNode* next;
  23. };
  24. struct List {
  25.     struct ListNode* first = NULL;
  26.     struct ListNode* Last = NULL;
  27.     struct ListNode* current = NULL;
  28.     int counter = 0;
  29. };
  30.  
  31. void alloc_check(void* p) {
  32.     if (p == NULL) {
  33.         printf("\n= Ошибка выделения памяти. =\n");
  34.         exit(-1);
  35.     }
  36. }
  37. bool current_check(List* L) {
  38.     if (L->current == NULL) {
  39.         printf("= Ошибка! Нет выбранного вектора! = \n");
  40.         return true;
  41.     }
  42.     else return false;
  43. }
  44. bool ListEmptyCheck(List* L) {
  45.     if (L->counter == 0) {
  46.         printf("Список пуст!\n");
  47.         return true;
  48.     }
  49.     else return false;
  50. }
  51. void clear_buff() {
  52.     int c;
  53.     while ((c = getchar()) != '\n' && c != EOF) {}
  54. }
  55. void MakeEmpty(Vec* V) {
  56.     struct Node* p, * p1;
  57.     p = V->first;
  58.     for (int i = 0; i < V->counter;i++) {
  59.         p1 = p->next;
  60.         free (p);
  61.         p = p1;
  62.     }
  63.     V->first = NULL;   
  64.     V->counter = 0;
  65.     printf("Список очищен!\n");
  66. }
  67. void EmptyCheck(Vec* V) {
  68.     if (V->counter == 0) {
  69.         printf("Список пуст!\n");
  70.     }
  71.     else {
  72.         printf("Список не пуст\n");
  73.     }
  74. }
  75. void ShowInd(Vec* V) {
  76.     int num = 0;
  77.     Node *tmp = V->first;
  78.     if (V->counter == 0) {
  79.         printf("Список пуст!\n");
  80.  
  81.     }
  82.     else {
  83.         printf("Введите индекс элемента: ");
  84.         if (scanf_s("%d", &num)==1 && num > 0 && num<=(V->counter)) {
  85.             for (int i = 0; i < num-1; i++) {
  86.                 tmp = tmp->next;
  87.             }
  88.             printf("Значение элемента: %d\n", tmp->value);
  89.         }
  90.         else {
  91.             printf("Введите правильное число!\n");
  92.         }
  93.     }
  94. }
  95. void EndAdd(Vec* V) {
  96.     int val = 0;
  97.     printf("Введите элемент:");
  98.     scanf_s("%d", &val);
  99.     Node* tmp = V->first;
  100.     if (V->first)
  101.     {
  102.         while (tmp->next)
  103.         {
  104.             tmp = tmp->next;
  105.         }
  106.         tmp->next = (Node*)malloc(sizeof(Node));
  107.         tmp->next->value = val;
  108.         tmp->next->next = NULL;
  109.     }
  110.     else
  111.     {
  112.         V->first = (Node*)malloc(sizeof(Node));
  113.         V->first->value = val;
  114.         V->first->next = NULL;
  115.     }
  116.  
  117.     V->counter++;
  118.     printf("Элемент добавлен\n");
  119. }
  120. void ShowVec(Vec* V) {
  121.     if (V->counter != 0) {
  122.         Node* curr = V->first;
  123.         while (curr) {
  124.             cout << curr->value << ' ';
  125.             curr = curr->next;
  126.         }
  127.         cout << endl;
  128.     }
  129.     else {
  130.         printf("Вектор пуст!\n");
  131.         return;
  132.     }
  133. }
  134. void EndDel(Vec* V) {
  135.     Node* tmp = V->first;
  136.     if (V->first)
  137.     {
  138.         while (tmp->next->next!=NULL)
  139.         {
  140.             tmp = tmp->next;
  141.         }
  142.         free(tmp->next);
  143.         tmp->next = NULL;
  144.         V->counter--;
  145.     }
  146.     printf("Элемент удален!\n");
  147. }
  148. void ChangebyInd(Vec* V)
  149. {
  150.     int num = 0;
  151.     int val;
  152.     Node* tmp = V->first;
  153.     if (V->counter == 0) {
  154.         printf("Список пуст!\n");
  155.     }
  156.     else {
  157.         printf("Введите индекс элемента: ");
  158.         scanf_s("%d", &num);
  159.         printf("Введите новое значение элемента: ");
  160.         scanf_s("%d", &val);
  161.         if (num > 0 && num <= V->counter) {
  162.             for (int i = 1; i < num; i++) {
  163.                 tmp = tmp->next;
  164.             }
  165.             tmp->value = val;
  166.         }
  167.         else {
  168.             printf("Элемента под данным индексом не существует!\n");
  169.             return;
  170.         }
  171.     }
  172. }
  173. void TakebyInd(Vec* V) {
  174.     int num = 0;
  175.     Node* tmp = V->first;
  176.     Node* prevTmp = NULL;
  177.     if (V->counter <= 0) {
  178.         printf("Список пуст!\n");
  179.     }
  180.     else {
  181.         printf("Введите индекс элемента: ");
  182.         scanf_s("%d", &num);
  183.         for (int i = 1; i <  num; i++) {
  184.             prevTmp = tmp;
  185.             tmp = tmp->next;
  186.         }
  187.         printf("Элемент: %d\n", tmp->value);
  188.         if (num != 1) {
  189.             prevTmp->next = tmp->next;
  190.         }
  191.         free(tmp);
  192.         V->counter--;
  193.     }
  194. }
  195.  
  196. void VecStart(Vec* V) {
  197.     while (1) {
  198.         int num;
  199.  
  200.         printf("= Обработка вектора =\n\
  201. 1.Сделать пустым\n\
  202. 2.Пуст ли ?\n\
  203. 3.Сколько элементов ?\n\
  204. 4.Показать значение элемента по индексу, при некорректном индексе выводится сообщение\n\
  205. 5.Удалить элемент из конца\n\
  206. 6.Взять элемент по индексу\n\
  207. 7.Изменить значение по индексу\n\
  208. 8.Добавить элемент в конец\n\
  209. 9.Распечатать вектор\n\
  210. 10.Закончить работу\n");
  211.         if (scanf_s("%d", &num) == 1) {
  212.             switch (num)
  213.             {
  214.             case 1:
  215.                 system("cls");
  216.                 MakeEmpty(V);
  217.  
  218.                 break;
  219.             case 2:
  220.                 system("cls");
  221.                 EmptyCheck(V);
  222.  
  223.                 break;
  224.             case 3:
  225.                 system("cls");
  226.                 printf("Количество элементов: %d\n", V->counter);
  227.  
  228.                 break;
  229.             case 4:
  230.                 system("cls");
  231.                 ShowInd(V);
  232.  
  233.                 break;
  234.             case 5:
  235.                 system("cls");
  236.                 EndDel(V);
  237.  
  238.                 break;
  239.             case 6:
  240.                 system("cls");
  241.                 TakebyInd(V);
  242.  
  243.                 break;
  244.             case 7:
  245.                 system("cls");
  246.                 ChangebyInd(V);
  247.  
  248.                 break;
  249.             case 8:
  250.                 system("cls");
  251.                 EndAdd(V);
  252.  
  253.                 break;
  254.             case 9:
  255.                 system("cls");
  256.                 ShowVec(V);
  257.  
  258.                 break;
  259.             case 10:
  260.                 return;
  261.                 break;
  262.             default:
  263.                 printf("Неправильное число!\n");
  264.  
  265.             }
  266.         }
  267.         else {
  268.             clear_buff();
  269.             printf("Неправильный символ!\n");
  270.         }
  271.     }
  272.  
  273. }
  274. //------------------------------
  275.  
  276.  
  277.  
  278. //Разделитель
  279.  
  280.  
  281.  
  282. //------------------------------
  283.  
  284. void ListFree(List* L){
  285.     struct ListNode* p, * p1;
  286.     p = L->first;
  287.     for(int i=0; i<L->counter;i++) {
  288.         p1 = p->next;
  289.         MakeEmpty(&p->value);
  290.         //возможна утечка
  291.         //free (p);
  292.         p = p1;
  293.     }
  294.     L->first = NULL;
  295.     L->Last = NULL;
  296.     L->current = NULL;
  297.     L->counter = 0;
  298. }
  299. void MoveIndFw(List* L){
  300.  
  301.     L->current = L->current->next;
  302. }
  303. void LookAfterInd(List* L){
  304.         printf("Вектор: ");
  305.         ShowVec(&L->current->next->value);
  306. }
  307.  
  308. void DelAftInd(List* L) {
  309.     if (L->counter == 0) {
  310.         printf("Список пуст!\n");
  311.     }
  312.     else {
  313.         ListNode* del;
  314.         del = (ListNode*)L->current->next;
  315.         L->current->next = del->next;
  316.         free(del);
  317.         L->counter--;
  318.         printf("Элемент удален!\n");
  319.     }  
  320. }
  321. void TakeAftInd(List* L) {
  322.     if (L->counter == 0) {
  323.         printf("Список пуст!\n");
  324.     }
  325.     else {
  326.         ListNode* del;
  327.         del = (ListNode*)L->current->next;
  328.         printf("Вектор: ");
  329.         ShowVec(&del->value);
  330.         L->current->next = del->next;
  331.         free(del);
  332.         L->counter--;
  333.         printf("Элемент удален!\n");
  334.     }
  335. }
  336. void ChangeAftInd(List* L) {
  337.     int val;
  338.     if (L->counter == 0) {
  339.         printf("Список пуст!\n");
  340.     }
  341.     else {
  342.         VecStart(&L->current->value);
  343.     }
  344. }
  345. void AddAftInd(List* L) {  
  346.    
  347.         ListNode* str;
  348.         if (L->counter == 0) {
  349.             str = (ListNode*)malloc(sizeof(ListNode));
  350.             alloc_check(str);  
  351.             str->value = { NULL,0 };
  352.             L->first = str;
  353.             L->current = str;
  354.             L->Last = str;
  355.             L->counter++;
  356.         }
  357.         else {
  358.             str = (ListNode*)malloc(sizeof(ListNode));
  359.             alloc_check(str);
  360.             str->value = { NULL,0 };
  361.             if (L->current == L->Last) {
  362.                 str->next = L->first;
  363.                 L->current->next = str;
  364.                 L->Last = str;
  365.                 L->counter++;
  366.             }
  367.             else {
  368.                 str->next = L->current->next;
  369.                 L->current->next = str;
  370.                 L->counter++;
  371.             }
  372.  
  373.         }
  374.    
  375.  
  376. }
  377. void PrintList(List* L) {
  378.     ListNode* pr = L->first;   
  379.     for (int i = 0;i<L->counter; i++) {
  380.         ShowVec(&pr->value);       
  381.         pr = pr->next;
  382.     }  
  383. }
  384.  
  385. void ListMenu(List *L)
  386. {
  387.     while (1) {
  388.         int num;
  389.         if (L->current == NULL) {
  390.             printf("Указатель нулл!!!!!!!!!\n");          
  391.         }
  392.         else { printf("Значение текущего указателя, указатель старт, указатель конец: %d, %d, %d, %d\n", L->current, L->first, L->Last, L->counter); }
  393.         printf("= Обработка кольцевого списка =\n\
  394. 1. Сделать список пустым\n\
  395. 2. Пусто ли? \n\
  396. 3. Установить рабочий указатель в начало списка\n\
  397. 4. В конце ли списка рабочий указатель? \n\
  398. 5. Передвинуть рабочий указатель вперёд\n\
  399. 6. Посмотреть за указатель\n\
  400. 7. Удалить за указателем\n\
  401. 8. Взять элемент за указателем\n\
  402. 9. Изменить значение элемента списка за указателем\n\
  403. 10. Добавить за указатель.\n\
  404. 11. Распечатать\n\
  405. 12. Закончить работу\n");
  406.        
  407.         if (scanf_s("%d", &num) == 1) {
  408.             switch (num)
  409.             {
  410.            
  411.             case 1:
  412.                 system("cls");
  413.                 ListFree(L);
  414.                 printf("Список очищен!\n");
  415.  
  416.                 break;
  417.             case 2:
  418.                 system("cls");
  419.                 if (L->counter == 0) {
  420.                     printf("Список пуст!\n");
  421.                 }
  422.                 else {
  423.                     printf("Список не пуст\n");
  424.                 }
  425.  
  426.                 break;
  427.             case 3:
  428.                 system("cls");
  429.                 L->current = L->first;
  430.                 printf("Курсор установлен\n");
  431.  
  432.                 break;
  433.             case 4:
  434.                 system("cls");
  435.                 if (ListEmptyCheck(L)) break;
  436.                 if (L->current == L->Last) {
  437.                     printf("Указатель на последнем элементе!\n");
  438.                 }
  439.                 else
  440.                     printf("Указатель не на последнем элементе!\n");
  441.  
  442.                 break;
  443.             case 5:
  444.                 system("cls");
  445.                 if (ListEmptyCheck(L)) break;              
  446.                 MoveIndFw(L);
  447.  
  448.                 break;
  449.             case 6:
  450.                 system("cls");
  451.                 if (ListEmptyCheck(L)) break;
  452.                 if (current_check(L)) break;
  453.                 LookAfterInd(L);
  454.  
  455.                 break;
  456.             case 7:
  457.                 system("cls");
  458.                 if (ListEmptyCheck(L)) break;
  459.                 if (current_check(L)) break;
  460.                 DelAftInd(L);
  461.  
  462.                 break;
  463.             case 8:
  464.                 system("cls");
  465.                 if (ListEmptyCheck(L)) break;
  466.                 if (current_check(L)) break;
  467.                 TakeAftInd(L);
  468.  
  469.                 break;
  470.             case 9:
  471.                 system("cls");
  472.                 if (ListEmptyCheck(L)) break;
  473.                 if (current_check(L)) break;
  474.                 ChangeAftInd(L);
  475.                 break;
  476.             case 10:
  477.                 system("cls");
  478.                 AddAftInd(L);
  479.                 ChangeAftInd(L);
  480.                 printf("Элемент добавлен!\n");
  481.                 break;
  482.             case 11:
  483.                 system("cls");
  484.                 PrintList(L);
  485.                 break;
  486.             case 12:               
  487.                 system("cls");
  488.                 ListFree(L);
  489.                 printf("Работа закончена\n");
  490.                 return;
  491.  
  492.             default:
  493.                 printf("Неправильное число!\n");
  494.  
  495.             }
  496.  
  497.         }
  498.         else {
  499.             clear_buff();
  500.             printf("Неправильный символ!\n");
  501.         }
  502.     }
  503.    
  504. }
  505.  
  506. void ProgramStart(List* L) {
  507.     int num = 0;
  508.     while (1) {
  509.         printf("1. Начать программу\n\
  510. 2. Выйти из программы\n");
  511.         if (scanf_s("%d", &num) == 1) {
  512.             switch (num) {
  513.             case 1:
  514.                 system("cls");
  515.                
  516.                 ListMenu(L);
  517.                
  518.                 break;
  519.             case 2:
  520.                 exit(1);
  521.                 break;
  522.  
  523.             default:
  524.                 printf("Неправильное число!\n");
  525.             }
  526.         }
  527.         else {
  528.             clear_buff();
  529.             printf("Неправильный символ!\n");
  530.         }
  531.     }
  532. }
  533.  
  534. int main() {
  535.     setlocale(LC_ALL, "Russian");
  536.     Vec V;
  537.     List L;
  538.     ProgramStart(&L);  
  539. }
Advertisement
Comments
Add Comment
Please, Sign In to add comment
Advertisement