Advertisement
stupid_pro

f5fin

Oct 27th, 2024
123
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.03 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. typedef struct Node* List;
  5.  
  6. typedef struct Node {
  7.     struct Node *next;
  8.     struct Node *prev;
  9.     int value;
  10. } Node;
  11.  
  12. void list_print(List);
  13. void list_print_back(List);
  14. void list_print_dbg(List);
  15. void list_insert(List, List);
  16. void list_push(List, List);
  17. void list_init(List); //инициализация списка
  18. void list_remove(List);
  19. void push_list(List, int);
  20. void list_delete(List *);
  21. int is_empty(List);
  22. void pop(List);
  23. void clear(List);
  24. void foo(List, int);
  25. void delete(List);
  26.  
  27. int main(int argc, char** argv) {
  28.     List list = calloc(1, sizeof(Node));
  29.     list_init(list);
  30.     int n = 0, cntr = 0;
  31.  
  32.     while (scanf("%d", &n) == 1) {
  33.         push_list(list, n);
  34.         cntr++;
  35.     }
  36.  
  37.     foo(list, cntr);
  38.     list_print_back(list);
  39.     clear(list);
  40.     free(list);
  41.     return 0;
  42. }
  43.  
  44. void foo(List list, int cntr) {
  45.     List curr = list->next;
  46.     for (int i = 0; i < cntr; i++) {
  47.         if (curr == list) break; // Проверка на конец списка
  48.         List ptr = curr;
  49.         curr = curr->next;
  50.         if (ptr->value > 100) {
  51.             list_remove(ptr);
  52.             list_push(ptr, list);
  53.         } else if (ptr->value < 100 && (abs(ptr->value) % 2 == 1)) {
  54.             list_remove(ptr);
  55.             free(ptr); // Освобождаем память
  56.         }
  57.     }
  58. }
  59.  
  60. void list_print(List list) {
  61.     for (List ptr = list->next; ptr != list; ptr = ptr->next)
  62.         printf("%d ", ptr->value);
  63.     putchar('\n');
  64. }
  65.  
  66. int is_empty(List list) {
  67.     return (list->next == list && list->prev == list);
  68. }
  69.  
  70. void list_print_back(List list) {
  71.     for (Node* ptr = list->prev; ptr != list; ptr = ptr->prev)
  72.         printf("%d ", ptr->value);
  73.     putchar('\n');
  74. }
  75.  
  76. void list_print_dbg(List list) {
  77.     Node* p = list;
  78.     printf("--------\n");
  79.     printf("list: prev=%p %p next=%p\n", p->prev, p, p->next);
  80.     for (Node* ptr = list->next; ptr != list; ptr = ptr->next)
  81.         printf("%d prev=%p %p next=%p\n", ptr->value, ptr->prev, ptr, ptr->next);
  82.     putchar('\n');
  83. }
  84.  
  85. void list_push(List add, List list) {
  86.     list_insert(add, list->prev);
  87. }
  88.  
  89. void list_init(List list) {
  90.     list->value = 0;
  91.     list->next = list;
  92.     list->prev = list;
  93. }
  94.  
  95. void pop(List list) {
  96.     List ptr = list->prev;
  97.     if (ptr != list) { // Проверка на пустоту
  98.         list_remove(ptr);
  99.         free(ptr);
  100.     }
  101. }
  102.  
  103. void list_remove(List del) {
  104.     Node* p = del->next;
  105.     Node* q = del->prev;
  106.  
  107.     p->prev = q;
  108.     q->next = p;
  109. }
  110.  
  111. void list_insert(List t, List p) {
  112.     Node* q = p->next; // следующий узел, после чего вставляем
  113.     t->prev = p;
  114.     t->next = q;
  115.     p->next = t;
  116.     q->prev = t;
  117. }
  118.  
  119. void push_list(List list, int data) {
  120.     List new = calloc(1, sizeof(Node));
  121.     new->value = data;
  122.     list_insert(new, list->prev);
  123. }
  124.  
  125. void delete(List t) {
  126.     list_remove(t);
  127.     free(t);
  128. }
  129.  
  130. void clear(List list) {
  131.     while (!is_empty(list)) {
  132.         pop(list);
  133.     }
  134. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement