diff options
| -rw-r--r-- | command_handling.c | 29 | ||||
| -rw-r--r-- | main.c | 82 | ||||
| -rw-r--r-- | push_swap.h | 14 | ||||
| -rw-r--r-- | sorting.c | 31 |
4 files changed, 97 insertions, 59 deletions
diff --git a/command_handling.c b/command_handling.c index e4dc476..0b5f335 100644 --- a/command_handling.c +++ b/command_handling.c @@ -6,7 +6,7 @@ /* By: dkaiser <dkaiser@student.42heilbronn.de +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/04/13 14:38:47 by dkaiser #+# #+# */ -/* Updated: 2024/04/15 16:35:05 by dkaiser ### ########.fr */ +/* Updated: 2024/04/16 09:27:41 by dkaiser ### ########.fr */ /* */ /* ************************************************************************** */ @@ -38,32 +38,31 @@ static void run_for_both(t_stack *stack_a, t_stack *stack_b, f(stack_b); } -void run_command(t_stack *stack_a, t_stack *stack_b, t_list **cmds, - enum e_pscmd cmd) +void run_command(t_psdata *data, enum e_pscmd cmd) { if (cmd == SA) - stack_swap(stack_a); + stack_swap(data->a); else if (cmd == SB) - stack_swap(stack_b); + stack_swap(data->b); else if (cmd == SS) - run_for_both(stack_a, stack_b, stack_swap); + run_for_both(data->a, data->b, stack_swap); else if (cmd == PA) - stack_push(stack_a, stack_b); + stack_push(data->a, data->b); else if (cmd == PB) - stack_push(stack_b, stack_a); + stack_push(data->b, data->a); else if (cmd == RA) - stack_rotate(stack_a); + stack_rotate(data->a); else if (cmd == RB) - stack_rotate(stack_b); + stack_rotate(data->b); else if (cmd == RR) - run_for_both(stack_a, stack_b, stack_rotate); + run_for_both(data->a, data->b, stack_rotate); else if (cmd == RRA) - stack_rrotate(stack_a); + stack_rrotate(data->a); else if (cmd == RRB) - stack_rrotate(stack_b); + stack_rrotate(data->b); else if (cmd == RRR) - run_for_both(stack_a, stack_b, stack_rrotate); - add_cmd_to_queue(cmds, cmd); + run_for_both(data->a, data->b, stack_rrotate); + add_cmd_to_queue(&data->cmds, cmd); } static void print_cmd(void *ptr_cmd) @@ -6,44 +6,76 @@ /* By: dkaiser <dkaiser@student.42heilbronn.de +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/04/12 17:03:30 by dkaiser #+# #+# */ -/* Updated: 2024/04/15 23:41:34 by dkaiser ### ########.fr */ +/* Updated: 2024/04/16 09:35:54 by dkaiser ### ########.fr */ /* */ /* ************************************************************************** */ #include "libft/ft_printf.h" #include "push_swap.h" -int main(int argc, char *argv[]) +static void free_data(t_psdata *data) { - t_stack *stack_a; - t_stack *stack_b; - t_list *pscmds; - - stack_a = create_stack(argc, argv); - if (!stack_a) + if (data) { - ft_putendl_fd("Error", 2); - return (1); + if (data->a) + { + if (data->a->stack) + free(data->a->stack); + free(data->a); + } + if (data->b) + { + if (data->b->stack) + free(data->b->stack); + free(data->b); + } + free(data); } +} + +static t_psdata *initialize_data(int argc, char *argv[]) +{ + t_psdata *result; - stack_b = malloc(sizeof(t_stack)); - if (!stack_b) + result = malloc(sizeof(t_psdata)); + if (result) { - //free everything + result->a = create_stack(argc, argv); + if (result->a) + { + result->b = malloc(sizeof(t_stack)); + if (result->b) + { + result->b->stack = malloc(sizeof(int) * (argc - 1)); + if (result->b->stack) + { + result->b->size = 0; + return result; + } + } + } } - stack_b->stack = malloc(sizeof(int) * (argc - 1)); - if (!stack_b->stack) + free_data(result); + return NULL; +} + +int main(int argc, char *argv[]) +{ + t_psdata *data; + + data = initialize_data(argc, argv); + if (!data) { - //free everything + ft_putendl_fd("Error", 2); + return (1); } - stack_b->size = 0; - stack_optimize(stack_a); - pscmds = stack_sort(stack_a, stack_b); - optimize_commands(&pscmds); - print_commands(pscmds); - /* ft_printf("\nA: "); */ - /* stack_print(stack_a); */ - /* ft_printf("B: "); */ - /* stack_print(stack_b); */ + stack_optimize(data->a); + stack_sort(data); + /* optimize_commands(&pscmds); */ + print_commands(data->cmds); + ft_printf("\nA: "); + stack_print(data->a); + ft_printf("B: "); + stack_print(data->b); return (0); } diff --git a/push_swap.h b/push_swap.h index 3500171..c7afb5f 100644 --- a/push_swap.h +++ b/push_swap.h @@ -6,7 +6,7 @@ /* By: dkaiser <dkaiser@student.42heilbronn.de +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/04/12 16:59:09 by dkaiser #+# #+# */ -/* Updated: 2024/04/15 17:41:05 by dkaiser ### ########.fr */ +/* Updated: 2024/04/16 09:29:15 by dkaiser ### ########.fr */ /* */ /* ************************************************************************** */ @@ -37,6 +37,13 @@ typedef struct s_stack int size; } t_stack; +typedef struct s_psdata +{ + t_stack *a; + t_stack *b; + t_list *cmds; +} t_psdata; + t_stack *create_stack(int argc, char *argv[]); void stack_swap(t_stack *stack); @@ -45,13 +52,12 @@ void stack_rotate(t_stack *stack); void stack_rrotate(t_stack *stack); void stack_print(t_stack *stack); -void run_command(t_stack *stack_a, t_stack *stack_b, t_list **cmds, - enum e_pscmd cmd); +void run_command(t_psdata *data, enum e_pscmd cmd); void print_commands(t_list *cmds); int stack_optimize(t_stack *stack); void optimize_commands(t_list **cmds); -t_list *stack_sort(t_stack *stack_a, t_stack *stack_b); +void stack_sort(t_psdata *data); #endif // PUSH_SWAP_H @@ -6,7 +6,7 @@ /* By: dkaiser <dkaiser@student.42heilbronn.de +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/04/13 15:04:19 by dkaiser #+# #+# */ -/* Updated: 2024/04/15 23:39:57 by dkaiser ### ########.fr */ +/* Updated: 2024/04/16 09:27:53 by dkaiser ### ########.fr */ /* */ /* ************************************************************************** */ @@ -31,29 +31,30 @@ int is_sorted(t_stack *stack) } -t_list *stack_sort(t_stack *stack_a, t_stack *stack_b) +void stack_sort(t_psdata *data) { - t_list *cmds = NULL; int pivot; - - int pivot_idx = stack_a->size - 1; - while (stack_b->size || !is_sorted(stack_a)) + int pivot_idx; + + data->cmds = NULL; + pivot_idx = data->a->size - 1; + while (data->b->size || !is_sorted(data->a)) { - pivot = stack_a->stack[pivot_idx]; + pivot = data->a->stack[pivot_idx]; - while (stack_a->size > 0 && stack_a->stack[0] != pivot) + while (data->a->size > 0 && data->a->stack[0] != pivot) { - if (stack_a->stack[0] > pivot) - run_command(stack_a, stack_b, &cmds, RA); + if (data->a->stack[0] > pivot) + run_command(data, RA); else - run_command(stack_a, stack_b, &cmds, PB); + run_command(data, PB); } - while (stack_b->size > 0) - run_command(stack_a, stack_b, &cmds, PA); - if (stack_a->stack[pivot_idx] == pivot) + while (data->b->size > 0) + run_command(data, PA); + if (data->a->stack[pivot_idx] == pivot) pivot_idx--; if (pivot_idx < 0) - pivot_idx = stack_a->size - 1; + pivot_idx = sdata->a->size - 1; } return cmds; } |
