From 428525b5611136e4adb32b6cb0279f87945be198 Mon Sep 17 00:00:00 2001 From: Tanguy MAZE Date: Wed, 6 Mar 2019 12:12:00 +0100 Subject: [PATCH] Nearly there !!! WIP merge sort still problems with negative numbers --- Makefile | 7 +-- includes/push_swap.h | 5 +- srcs/ps_push.c | 9 ++-- srcs/ps_stktools.c | 6 +-- srcs/ps_swap.c | 17 +++---- srcs/push_swap.c | 106 +++++++++++++++++++++++++++++++++++++------ 6 files changed, 114 insertions(+), 36 deletions(-) diff --git a/Makefile b/Makefile index c770442..b2ca9d1 100644 --- a/Makefile +++ b/Makefile @@ -6,7 +6,7 @@ # By: tmaze +#+ +:+ +#+ # # +#+#+#+#+#+ +#+ # # Created: 2019/02/23 14:30:57 by tmaze #+# #+# # -# Updated: 2019/02/25 15:55:49 by tmaze ### ########.fr # +# Updated: 2019/03/06 11:37:28 by tmaze ### ########.fr # # # #******************************************************************************# @@ -42,10 +42,7 @@ SRC = ps_push.c \ ps_rerot.c \ ps_swap.c \ ps_stktools.c \ - ps_stktools2.c \ - ft_strsplitwhitespace.c\ - \ - checker.c + ps_stktools2.c MAIN1 = checker.c MAIN2 = push_swap.c diff --git a/includes/push_swap.h b/includes/push_swap.h index af68fcd..c352e68 100644 --- a/includes/push_swap.h +++ b/includes/push_swap.h @@ -6,7 +6,7 @@ /* By: tmaze +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/02/21 14:13:53 by tmaze #+# #+# */ -/* Updated: 2019/03/02 18:21:11 by tmaze ### ########.fr */ +/* Updated: 2019/03/06 11:07:38 by tmaze ### ########.fr */ /* */ /* ************************************************************************** */ @@ -22,6 +22,7 @@ typedef struct s_stack { int nb; + int ind; struct s_stack *next; } t_stack; @@ -45,7 +46,7 @@ void ps_initdata(t_psdata *data); void ps_swap(t_psdata *data, char c); void ps_sswap(t_psdata *data); -void ps_push(t_psdata *data, char c); +int ps_push(t_psdata *data, char c); void ps_rot(t_psdata *data, char c); void ps_rrot(t_psdata *data); void ps_rerot(t_psdata *data, char c); diff --git a/srcs/ps_push.c b/srcs/ps_push.c index 5e3ae36..7f6614c 100644 --- a/srcs/ps_push.c +++ b/srcs/ps_push.c @@ -6,16 +6,17 @@ /* By: tmaze +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/02/21 15:59:46 by tmaze #+# #+# */ -/* Updated: 2019/02/23 15:45:30 by tmaze ### ########.fr */ +/* Updated: 2019/03/06 11:36:38 by tmaze ### ########.fr */ /* */ /* ************************************************************************** */ #include "push_swap.h" -void ps_push(t_psdata *data, char c) +int ps_push(t_psdata *data, char c) { t_stack *tmp; - tmp = ps_stkpop(data, (c == 'a') ? c : 'b'); - ps_stkpsh(data, c, tmp); + if ((tmp = ps_stkpop(data, (c == 'a') ? 'b' : 'a')) != NULL) + ps_stkpsh(data, c, tmp); + return (tmp != NULL); } diff --git a/srcs/ps_stktools.c b/srcs/ps_stktools.c index b919d55..8d8c2b1 100644 --- a/srcs/ps_stktools.c +++ b/srcs/ps_stktools.c @@ -6,7 +6,7 @@ /* By: tmaze +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/02/22 14:41:27 by tmaze #+# #+# */ -/* Updated: 2019/03/02 15:23:43 by tmaze ### ########.fr */ +/* Updated: 2019/03/06 11:37:06 by tmaze ### ########.fr */ /* */ /* ************************************************************************** */ @@ -61,12 +61,10 @@ t_stack *ps_stkpop(t_psdata *data, char c) s = &(data->a); if (c == 'a') size = &(data->size_a); - if (c == 'b') + else if (c == 'b') s = &(data->b); if (c == 'b') size = &(data->size_b); - else if (c != 'a' && c != 'b') - return (NULL); ret = NULL; if (s != NULL && *s != NULL) { diff --git a/srcs/ps_swap.c b/srcs/ps_swap.c index 906455f..9cc63bd 100644 --- a/srcs/ps_swap.c +++ b/srcs/ps_swap.c @@ -6,7 +6,7 @@ /* By: tmaze +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/02/21 14:06:40 by tmaze #+# #+# */ -/* Updated: 2019/03/02 15:34:54 by tmaze ### ########.fr */ +/* Updated: 2019/03/06 12:02:03 by tmaze ### ########.fr */ /* */ /* ************************************************************************** */ @@ -14,23 +14,24 @@ void ps_swap(t_psdata *data, char c) { - t_stack *s; + t_stack **s; size_t size; - int tmp; + t_stack *tmp; if (c == 'a') - s = data->a; + s = &(data->a); if (c == 'a') size = data->size_a; else if (c == 'b') - s = data->b; + s = &(data->b); if (c == 'b') size = data->size_b; if (s != NULL && size >= 2) { - tmp = s->nb; - s->nb = s->next->nb; - s->next->nb = tmp; + tmp = *s; + *s = (*s)->next; + tmp->next = (*s)->next; + (*s)->next = tmp; } } diff --git a/srcs/push_swap.c b/srcs/push_swap.c index 5598e73..0d8cd25 100644 --- a/srcs/push_swap.c +++ b/srcs/push_swap.c @@ -6,34 +6,114 @@ /* By: tmaze +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2019/03/03 11:41:49 by tmaze #+# #+# */ -/* Updated: 2019/03/05 18:19:58 by tmaze ### ########.fr */ +/* Updated: 2019/03/06 12:10:10 by tmaze ### ########.fr */ /* */ /* ************************************************************************** */ #include "push_swap.h" -void sort(t_psdata *data, int sortby) +int sort(t_psdata *data, int size) { - int i; - int j; + t_stack *ptr; + int i; - if (sortby => 2) - sort(data, sortby / 2); - i = data->size_a / sortby; - j = sortby; - + printf("start sort %d\n", size); + if (size > 2) + { + if (!sort(data, ((size % 2) ? size + 1 : size) / 2)) + return (0); + if (!sort(data, size - (((size % 2) ? size + 1 : size) / 2))) + return (0); + } + else if (size == 1) + return (1); + i = 0; + ptr = data->a; + while (i < ((size % 2) ? size + 1 : size) / 2) + { + ptr->ind = 1; + ptr = ptr->next; + i++; + } + i = 0; + while (ptr && i < (size - (((size % 2) ? size + 1 : size) / 2))) + { + ptr->ind = 2; + ptr = ptr->next; + i++; + } + i = 0; + ptr = data->a; + while (ptr) + { + printf("@ind %d: nb=%d ind=%d\n", i, ptr->nb, ptr->ind); + ptr = ptr->next; + i++; + } + while (data->a->ind == 1) + { + printf("pb\n"); + if (!ps_push(data, 'b')) + return (0); + if (data->size_b > 1) + { + printf("rb\n"); + ps_rot(data, 'b'); + } + } + while (data->a->ind != 0 || data->size_b > 0) + { + printf("data->a->ind %d\ndata->a->nb %d\ndata->size_b %zu\n", data->a->ind, data->a->nb, data->size_b); + if ((data->a->ind != 0 && data->size_b > 0 && data->a->nb > data->b->nb) + || (data->a->ind == 0 && data->size_b > 0)) + { + printf("pa\n"); + ps_push(data, 'a'); + } + printf("mise a zero:\ndata->a->ind %d\ndata->a->nb %d\n", data->a->ind, data->a->nb); + data->a->ind = 0; + printf("ra\n"); + ps_rot(data, 'a'); + i = 0; + ptr = data->a; + while (ptr) + { + printf("@ind %d: nb=%d ind=%d\n", i, ptr->nb, ptr->ind); + ptr = ptr->next; + i++; + } + } + return (1); } int main(int ac, char **av) { + t_stack *ptr; t_psdata data; ps_initdata(&data); - ret = 0; if (!get_params(&data, ac, av)) return (0); - new = data.a; - if (new == NULL) + ptr = data.a; + if (ptr == NULL) ft_putendl("Empty"); - sort(&data, ((data.size_a % 2) ? data.sizea + 1 : data.size_a) / 2); + while (ptr) + { + ptr->ind = 0; + ptr = ptr->next; + } + if (!sort(&data, data.size_a)) + { + printf("Error\n"); + ps_stkclean(&data); + return (1); + } + ptr = data.a; + while (ptr) + { + printf("%d\n", ptr->nb); + ptr->ind = 0; + ptr = ptr->next; + } + return (0); }