Advertisement
stupid_pro

f5

Oct 27th, 2024
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.14 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(void) {;
  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.    
  42.     return 0;
  43. }
  44.  
  45. void foo(List list, int cntr) {
  46.     List curr = list->next;
  47.     for (int i = 0; i < cntr; i++) {
  48.         List ptr = curr;
  49.         if (curr->value > 100) {
  50.             list_remove(ptr);
  51.             curr = ptr->next;
  52.             list_push(ptr, list);
  53.         }
  54.         else
  55.             if (curr->value < 100 && (abs(curr->value) % 2 == 1)) {
  56.                 list_remove(ptr);
  57.                 curr = ptr->next;
  58.                 free(ptr);
  59.             }
  60.         else
  61.             curr = curr->next;
  62.     }
  63. }
  64.  
  65. void list_print(List list) {
  66.     for (List ptr = list->next; ptr != list; ptr = ptr->next)
  67.         printf("%d ", ptr->value);
  68.     putchar('\n');
  69. }
  70.  
  71. int is_empty(List list) {
  72.     return ((list->next == list->prev) && (list->value == list->next->value));
  73. }
  74.  
  75. void list_print_back(List list) {
  76.     for (Node* ptr = list->prev; ptr != list; ptr = ptr->prev)
  77.         printf("%d ", ptr->value);
  78.     putchar('\n');
  79. }
  80.  
  81. void list_print_dbg(List list) {
  82.     Node* p = list;
  83.     printf("--------\n");
  84.     printf("list: prev=%p %p next=%p\n", p->prev, p, p->next);
  85.     for (Node* ptr = list->next; ptr != list; ptr = ptr->next)
  86.         printf("%d prev=%p %p next=%p\n", ptr->value, ptr->prev, ptr, ptr->next);
  87.     putchar('\n');
  88. }
  89.  
  90. //функция добавляет узел в список
  91. void list_insert(List t, List p) {
  92.     Node* q = p->next; //следущий узел, после чего вставляем
  93.     t->prev = p;
  94.     t->next = q;
  95.     p->next = t;
  96.     q->prev = t;
  97. }
  98.  
  99. void list_push(List add, List list) {
  100.     list_insert(add, list->prev);
  101. }
  102.  
  103. void list_init(List list) {
  104.     list->value = 0;
  105.     list->next = list;
  106.     list->prev = list;
  107. }
  108.  
  109. void pop(List list) {
  110.     List ptr = list->prev;
  111.     list_remove(ptr);
  112.     free(ptr);
  113. }
  114.  
  115. void list_remove(List del) {
  116.     Node* p = del->next;
  117.     Node* q = del->prev;
  118.  
  119.     p->prev = q;
  120.     q->next = p;
  121. }
  122.  
  123. //для первоначального заполнения списка
  124. void push_list(List list, int data) {
  125.     List new = calloc(1, sizeof(Node));
  126.     new->value = data;
  127.     new->next = NULL;
  128.     new->prev = NULL;
  129.     list_push(new, list);
  130. }
  131.  
  132. void delete(List t) {
  133.     list_remove(t);
  134.     free(t);
  135. }
  136.  
  137. void clear(List list) {
  138.     while (!is_empty(list)) {
  139.         pop(list);
  140.     }
  141. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement