so_find_index.c
1 /* ************************************************************************** */ 2 /* */ 3 /* ::: :::::::: */ 4 /* so_find_index.c :+: :+: :+: */ 5 /* +:+ +:+ +:+ */ 6 /* By: gychoi <gychoi@student.42seoul.kr> +#+ +:+ +#+ */ 7 /* +#+#+#+#+#+ +#+ */ 8 /* Created: 2022/11/29 11:46:41 by gychoi #+# #+# */ 9 /* Updated: 2022/12/07 20:42:53 by gychoi ### ########.fr */ 10 /* */ 11 /* ************************************************************************** */ 12 13 #include "push_swap.h" 14 15 static int find_best_index_max(t_deque *deque, int data) 16 { 17 int d_index; 18 int u_index; 19 20 d_index = check_downward(deque, data) + 1; 21 u_index = check_upward(deque, data); 22 if (d_index < u_index) 23 return (d_index); 24 else 25 return (u_index * -1); 26 } 27 28 int find_best_index_min_mid(t_deque *deque, int data) 29 { 30 int d_index; 31 int u_index; 32 33 d_index = check_downward(deque, data); 34 u_index = check_upward(deque, data) + 1; 35 if (d_index < u_index) 36 return (d_index); 37 else 38 return (u_index * -1); 39 } 40 41 static int find_deque_a_index(t_deque *deque_a, t_list *node) 42 { 43 int data; 44 45 if (node->data > deque_max_data(deque_a)) 46 { 47 data = deque_max_data(deque_a); 48 return (find_best_index_max(deque_a, data)); 49 } 50 else if (node->data < deque_min_data(deque_a)) 51 { 52 data = deque_min_data(deque_a); 53 return (find_best_index_min_mid(deque_a, data)); 54 } 55 else 56 { 57 data = deque_mid_data(deque_a, node->data); 58 return (find_best_index_min_mid(deque_a, data)); 59 } 60 } 61 62 static int ps_abs(int n) 63 { 64 if (n < 0) 65 return (n * -1); 66 return (n); 67 } 68 69 void find_index(t_deque *deque_a, t_deque *deque_b, int *ia, int *ib) 70 { 71 int i; 72 int a_idx; 73 int b_idx; 74 t_list *node; 75 76 i = 0; 77 node = deque_b->head; 78 while (i < deque_b->size) 79 { 80 a_idx = find_deque_a_index(deque_a, node); 81 b_idx = i; 82 if (i >= (deque_b->size) / 2) 83 b_idx = (deque_b->size - i) * -1; 84 if (i == 0 || ps_abs(*ia) + ps_abs(*ib) > ps_abs(a_idx) + ps_abs(b_idx)) 85 { 86 *ia = a_idx; 87 *ib = b_idx; 88 } 89 node = node->next; 90 i++; 91 } 92 }