ps_deque_utils.c
1 /* ************************************************************************** */ 2 /* */ 3 /* ::: :::::::: */ 4 /* ps_deque_utils.c :+: :+: :+: */ 5 /* +:+ +:+ +:+ */ 6 /* By: gychoi <gychoi@student.42seoul.kr> +#+ +:+ +#+ */ 7 /* +#+#+#+#+#+ +#+ */ 8 /* Created: 2022/11/13 21:37:23 by gychoi #+# #+# */ 9 /* Updated: 2022/12/04 22:31:40 by gychoi ### ########.fr */ 10 /* */ 11 /* ************************************************************************** */ 12 13 #include "push_swap.h" 14 15 int deque_sorted(t_deque *deque) 16 { 17 t_list *node; 18 19 node = deque->head; 20 if (node == NULL || node->next == NULL) 21 return (1); 22 while (node->next) 23 { 24 if (node->data > node->next->data) 25 return (0); 26 node = node->next; 27 } 28 return (1); 29 } 30 31 void deque_partition(t_deque *deque_a, t_deque *deque_b, int p_a, int p_b) 32 { 33 int size; 34 35 size = deque_a->size; 36 while (--size) 37 { 38 if (deque_a->head->data < p_a) 39 { 40 pb(deque_a, deque_b); 41 rb(deque_b); 42 } 43 else if (deque_a->head->data < p_b && deque_a->head->data != p_a) 44 pb(deque_a, deque_b); 45 else 46 ra(deque_a); 47 } 48 while (deque_a->size > 2) 49 { 50 if (deque_a->head->data != p_a && deque_a->head->data != p_b) 51 pb(deque_a, deque_b); 52 else 53 ra(deque_a); 54 } 55 sort_small(deque_a, deque_b, deque_a->size); 56 } 57 58 t_deque *ps_deqnew(void) 59 { 60 t_deque *deq; 61 62 deq = (t_deque *)malloc(sizeof(t_deque)); 63 if (deq == NULL) 64 exit(1); 65 deq->size = 0; 66 deq->head = NULL; 67 deq->tail = NULL; 68 return (deq); 69 } 70 71 void deque_clear(t_deque *deque_a, t_deque *deque_b) 72 { 73 if (!deque_a || !deque_b) 74 return ; 75 ps_lstclear(deque_a); 76 ps_lstclear(deque_b); 77 free(deque_a); 78 free(deque_b); 79 } 80 81 void deque_set(t_deque *deque_a, t_list **list, int *array, int argc) 82 { 83 int i; 84 85 i = 0; 86 while (i < argc - 1) 87 { 88 ps_lstadd_back(list, ps_lstnew(array[i])); 89 i++; 90 } 91 deque_a->size = argc - 1; 92 deque_a->head = *list; 93 deque_a->tail = ps_lstlast(*list); 94 }