diff options
| author | Dominik Kaiser | 2024-04-26 18:36:07 +0200 |
|---|---|---|
| committer | Dominik Kaiser | 2024-04-26 18:36:07 +0200 |
| commit | 9ec4dd2e78c61a2b2be8d645d3e523f954d83e9e (patch) | |
| tree | f824fdab2ce898a39dd9c79b22a627d156374e59 | |
| parent | fb11c45c1fa1246dbc80b491f55598698a932e5f (diff) | |
| download | push_swap-9ec4dd2e78c61a2b2be8d645d3e523f954d83e9e.tar.gz push_swap-9ec4dd2e78c61a2b2be8d645d3e523f954d83e9e.zip | |
Sort three and some norme cleanup
| -rw-r--r-- | Makefile | 2 | ||||
| -rw-r--r-- | cmd_optimization.c | 32 | ||||
| -rw-r--r-- | ft_atol.c | 41 | ||||
| -rw-r--r-- | input_handling.c | 9 | ||||
| -rw-r--r-- | push_swap.h | 3 | ||||
| -rw-r--r-- | sorting.c | 22 |
6 files changed, 91 insertions, 18 deletions
@@ -5,7 +5,7 @@ LIBFT = libft CC = cc CFLAGS = -Wall -Wextra -Werror -SRC_FILES = main.c input_handling.c stack_utils.c command_handling.c sorting.c stack_optimization.c cmd_optimization.c +SRC_FILES = main.c ft_atol.c input_handling.c stack_utils.c command_handling.c sorting.c stack_optimization.c cmd_optimization.c OBJ_FILES = $(SRC_FILES:%.c=%.o) LIB_DIR = $(LIBFT) diff --git a/cmd_optimization.c b/cmd_optimization.c index ac023c5..b310f34 100644 --- a/cmd_optimization.c +++ b/cmd_optimization.c @@ -6,7 +6,7 @@ /* By: dkaiser <dkaiser@student.42heilbronn.de +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/04/13 16:42:34 by dkaiser #+# #+# */ -/* Updated: 2024/04/26 13:55:55 by dkaiser ### ########.fr */ +/* Updated: 2024/04/26 15:52:23 by dkaiser ### ########.fr */ /* */ /* ************************************************************************** */ @@ -22,6 +22,15 @@ static enum e_pscmd get_cmd(t_list *cmd) return (NO_CMD); } +static void set_last(t_list **last, t_list **cur) +{ + *last = (*last)->next; + if (*last) + *cur = (*last)->next; + else + *cur = NULL; +} + static void optimize_redundant(t_psdata *data, enum e_pscmd cmd1, enum e_pscmd cmd2) { @@ -30,7 +39,10 @@ static void optimize_redundant(t_psdata *data, enum e_pscmd cmd1, int optimizations; cur = data->cmds; - last = cur; + last = ft_lstnew(NULL); + if (!last) + return ; + last->next = cur; optimizations = 0; while (cur && cur->next) { @@ -42,11 +54,7 @@ static void optimize_redundant(t_psdata *data, enum e_pscmd cmd1, ft_lstdelone(cur, free); optimizations++; } - last = last->next; - if (last) - cur = last->next; - else - cur = NULL; + set_last(&last, &cur); } if (optimizations) optimize_redundant(data, cmd1, cmd2); @@ -60,7 +68,9 @@ static void optimize_two_stack_ops(t_psdata *data, enum e_pscmd cmd1, int optimizations; cur = data->cmds; - last = cur; + last = ft_lstnew(NULL); + if (!last) + return ; optimizations = 0; while (cur && cur->next) { @@ -72,11 +82,7 @@ static void optimize_two_stack_ops(t_psdata *data, enum e_pscmd cmd1, ft_lstdelone(cur, free); optimizations++; } - last = last->next; - if (last) - cur = last->next; - else - cur = NULL; + set_last(&last, &cur); } if (optimizations) optimize_two_stack_ops(data, cmd1, cmd2, new_cmd); diff --git a/ft_atol.c b/ft_atol.c new file mode 100644 index 0000000..8184301 --- /dev/null +++ b/ft_atol.c @@ -0,0 +1,41 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_atol.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: dkaiser <dkaiser@student.42heilbronn.de +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2024/04/26 16:18:28 by dkaiser #+# #+# */ +/* Updated: 2024/04/26 17:56:54 by dkaiser ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "push_swap.h" + +long ft_atol(const char *str) +{ + long result; + int i; + int posneg; + + posneg = 1; + result = 0; + i = 0; + while ((str[i] >= '\t' && str[i] <= '\r') || str[i] == ' ') + { + i++; + } + if (str[i] == '-') + { + posneg = -1; + i++; + } + else if (str[i] == '+') + i++; + while (str[i] >= '0' && str[i] <= '9') + { + result = 10 * result + str[i] - '0'; + i++; + } + return (result * posneg); +} diff --git a/input_handling.c b/input_handling.c index 274a0fb..50e9e87 100644 --- a/input_handling.c +++ b/input_handling.c @@ -6,7 +6,7 @@ /* By: dkaiser <dkaiser@student.42heilbronn.de +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/04/12 17:31:49 by dkaiser #+# #+# */ -/* Updated: 2024/04/26 13:55:13 by dkaiser ### ########.fr */ +/* Updated: 2024/04/26 18:35:38 by dkaiser ### ########.fr */ /* */ /* ************************************************************************** */ @@ -17,6 +17,8 @@ static int is_nbr(char *str) { if (*str == '-') str++; + if (!*str) + return (0); while (*str) { if (ft_isdigit(*str)) @@ -29,10 +31,15 @@ static int is_nbr(char *str) static int is_input_only_nbrs(int argc, char *argv[]) { + long nbr; + while (argc-- > 1) { if (!is_nbr(argv[argc])) return (0); + nbr = ft_atol(argv[argc]); + if (nbr < -2147483648 || nbr > 2147483647) + return (0); } return (1); } diff --git a/push_swap.h b/push_swap.h index 3091fb8..99b99af 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/26 13:54:38 by dkaiser ### ########.fr */ +/* Updated: 2024/04/26 16:19:46 by dkaiser ### ########.fr */ /* */ /* ************************************************************************** */ @@ -45,6 +45,7 @@ typedef struct s_psdata } t_psdata; t_stack *create_stack(int argc, char *argv[]); +long ft_atol(const char *str); void stack_swap(t_stack *stack); void stack_push(t_stack *dst_stack, t_stack *src_stack); @@ -6,7 +6,7 @@ /* By: dkaiser <dkaiser@student.42heilbronn.de +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2024/04/13 15:04:19 by dkaiser #+# #+# */ -/* Updated: 2024/04/26 13:54:26 by dkaiser ### ########.fr */ +/* Updated: 2024/04/26 18:35:27 by dkaiser ### ########.fr */ /* */ /* ************************************************************************** */ @@ -28,6 +28,18 @@ static int is_sorted(t_stack *stack) return (1); } +static void sort_three(t_psdata *data) +{ + if (data->a->stack[1] > data->a->stack[0] + && data->a->stack[1] > data->a->stack[2]) + run_command(data, RRA); + else if (data->a->stack[0] > data->a->stack[1] + && data->a->stack[0] > data->a->stack[2]) + run_command(data, RA); + if (data->a->stack[0] > data->a->stack[1]) + run_command(data, SA); +} + static void ps_radixsort(t_psdata *data, int bit) { int i; @@ -51,6 +63,12 @@ static void ps_radixsort(t_psdata *data, int bit) void stack_sort(t_psdata *data) { - if (!is_sorted(data->a)) + if (is_sorted(data->a)) + return ; + else if (data->a->size == 2) + run_command(data, SA); + else if (data->a->size == 3) + sort_three(data); + else ps_radixsort(data, 0); } |
