Advertisement
anticlown

Списки(3 сем)

Nov 21st, 2023
791
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.69 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2.  
  3. #include <stdio.h>
  4. #include <stdlib.h>
  5. #include <locale.h>
  6. #include <malloc.h>
  7. #include <stdbool.h>
  8.  
  9. //node struct
  10. typedef struct Node {
  11.     int value;
  12.     struct Node* next;
  13. } Node;
  14.  
  15. //struct methods prototypes
  16. int pop(Node** head);
  17. void popBack(Node** head);
  18. void push(Node** head, int data);
  19. void pushBack(Node* head, int value);
  20. Node* getNth(Node* head, int n);
  21. Node* getLast(Node* head);
  22. Node* getLastButOne(Node* head);
  23. void insert(Node* head, unsigned pos, int val);
  24. int deleteNth(Node** head, int n);
  25. void fromArray(Node** head, int* arr, size_t size);
  26. int* toArray(const Node* head, const int length);
  27. void printLinkedList(const Node* head);
  28.  
  29. //task prototypes
  30. void insert44BeforeAnyMultipleOfSeven(Node* head);
  31.  
  32. //print prototypes
  33. void printLinkedList(const Node* head);
  34. void printTaskInfo();
  35.  
  36. /*      list methods start      */
  37. void push(Node** head, int data) {
  38.     Node* tmp = (Node*)malloc(sizeof(Node));
  39.     tmp->value = data;
  40.     tmp->next = (*head);
  41.     (*head) = tmp;
  42. }
  43.  
  44. void pushBack(Node* head, int value) {
  45.     Node* last = getLast(head);
  46.     Node* tmp = (Node*)malloc(sizeof(Node));
  47.     tmp->value = value;
  48.     tmp->next = NULL;
  49.     last->next = tmp;
  50. }
  51.  
  52. int pop(Node** head) {
  53.     Node* prev = NULL;
  54.     int val;
  55.     if (head == NULL) {
  56.         exit(-1);
  57.     }
  58.     prev = (*head);
  59.     val = prev->value;
  60.     (*head) = (*head)->next;
  61.     free(prev);
  62.     return val;
  63. }
  64.  
  65. void popBack(Node** head) {
  66.     Node* lastbn = NULL;
  67.     //Получили NULL
  68.     if (!head) {
  69.         exit(-1);
  70.     }
  71.     //Список пуст
  72.     if (!(*head)) {
  73.         exit(-1);
  74.     }
  75.     lastbn = getLastButOne(*head);
  76.     //Если в списке один элемент
  77.     if (lastbn == NULL) {
  78.         free(*head);
  79.         *head = NULL;
  80.     }
  81.     else {
  82.         free(lastbn->next);
  83.         lastbn->next = NULL;
  84.     }
  85. }
  86.  
  87. Node* getNth(Node* head, int n) {
  88.     int counter = 0;
  89.     while (counter < n && head) {
  90.         head = head->next;
  91.         counter++;
  92.     }
  93.     return head;
  94. }
  95.  
  96. Node* getLast(Node* head) {
  97.     if (head == NULL) {
  98.         return NULL;
  99.     }
  100.     while (head->next) {
  101.         head = head->next;
  102.     }
  103.     return head;
  104. }
  105.  
  106. Node* getLastButOne(Node* head) {
  107.     if (head == NULL) {
  108.         exit(-2);
  109.     }
  110.     if (head->next == NULL) {
  111.         return NULL;
  112.     }
  113.     while (head->next->next) {
  114.         head = head->next;
  115.     }
  116.     return head;
  117. }
  118.  
  119. //вставка на n-ое место
  120. void insert(Node* head, unsigned pos, int val) {
  121.     unsigned i = 0;
  122.     Node* tmp = NULL;
  123.     while (i < pos && head->next) {
  124.         head = head->next;
  125.         i++;
  126.     }
  127.     tmp = (Node*)malloc(sizeof(Node));
  128.     tmp->value = val;
  129.     if (head->next) {
  130.         tmp->next = head->next;
  131.     }
  132.     else {
  133.         tmp->next = NULL;
  134.     }
  135.     head->next = tmp;
  136. }
  137.  
  138. //удаление n-го места
  139. int deleteNth(Node** head, int n) {
  140.     if (n == 0) {
  141.         return pop(head);
  142.     }
  143.     else {
  144.         Node* prev = getNth(*head, n - 1);
  145.         Node* elm = prev->next;
  146.         int val = elm->value;
  147.  
  148.         prev->next = elm->next;
  149.         free(elm);
  150.         return val;
  151.     }
  152. }
  153.  
  154. void fromArray(Node** head, int* arr, size_t size) {
  155.     size_t i = size - 1;
  156.     if (arr == NULL || size == 0) {
  157.         return;
  158.     }
  159.     do {
  160.         push(head, arr[i]);
  161.     } while (i-- != 0);
  162. }
  163.  
  164. int* toArray(const Node* head, const int length) {
  165.     int leng = length;
  166.     int* values = (int*)malloc(leng * sizeof(int));
  167.     while (head) {
  168.         values[--leng] = head->value;
  169.         head = head->next;
  170.     }
  171.     return values;
  172. }
  173.  
  174. /*      task methods start      */
  175. int findFirstMultipleOfFive(const Node* head) {
  176.     int counter = 0;
  177.     while (head) {
  178.         if (head->value % 5 == 0) {
  179.             return counter;
  180.         }
  181.         counter++;
  182.         head = head->next;
  183.     }
  184.     return -1;
  185. }
  186.  
  187. void insert44BeforeAnyMultipleOfSeven(Node* head) {
  188.     int pos = 0;
  189.     Node* tempHead = head;
  190.     while (tempHead) {
  191.         if (tempHead->value % 7 == 0) {
  192.            insert(head, pos - 1, 44);
  193.            pos++;
  194.         }
  195.         pos++;
  196.         tempHead = tempHead->next;
  197.     }
  198. }
  199. /*      task methods end        */
  200.  
  201. /*      print procs start      */
  202. void printLinkedList(const Node* head) {
  203.     while (head) {
  204.         printf("%d ", head->value);
  205.         head = head->next;
  206.     }
  207.     printf("\n");
  208. }
  209.  
  210. void printTaskInfo() {
  211.     printf("Данная программа создает однонаправленный список из целых чисел.\n");
  212.     printf("Затем удаляет первый элемент, кратный 5. После этого вставляет число 44 перед каждым числом, кратным 7.\n");
  213. }
  214. /*      print procs end      */
  215.  
  216. int main()
  217. {
  218.     setlocale(LC_ALL, "Rus");
  219.     printTaskInfo();
  220.     Node* head = NULL;
  221.  
  222.     int arr[] = { 1,7,5,23,25,11,12,21,19,100 };
  223.     fromArray(&head, arr, 10);
  224.  
  225.     printf("Начальный список: ");
  226.     printLinkedList(head);
  227.  
  228.     int posToDel = findFirstMultipleOfFive(head);
  229.     if (posToDel == -1) {
  230.         printf("Элемента со значением, кратным пяти, нет в списке.");
  231.     }
  232.     else {
  233.         deleteNth(&head, posToDel);
  234.         printf("Список после удаление первого элемента, кратного пяти: ");
  235.         printLinkedList(head);
  236.     }
  237.  
  238.     insert44BeforeAnyMultipleOfSeven(head);
  239.     printf("Список после вставки 44 перед каждым элементом, кратным семи: ");
  240.     printLinkedList(head);
  241.  
  242.     getch();
  243. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement