From 0d10f17f9db0dea7180d2592423bbd4831b447b6 Mon Sep 17 00:00:00 2001 From: Jack Halford Date: Wed, 14 Sep 2016 22:41:44 +0200 Subject: [PATCH] lst sort --- libft/ft_lst_sort.c | 37 +++++++++++++++++++++++++++++++++++++ libft/libft.h | 1 + 2 files changed, 38 insertions(+) create mode 100644 libft/ft_lst_sort.c diff --git a/libft/ft_lst_sort.c b/libft/ft_lst_sort.c new file mode 100644 index 00000000..905aa624 --- /dev/null +++ b/libft/ft_lst_sort.c @@ -0,0 +1,37 @@ +#include "libft.h" + +static void ft_lst_swap(t_list **current) +{ + t_list *tmp; + + tmp = (*current)->next->next; + (*current)->next->next = (*current); + (*current)->next = tmp; +} + +void ft_lst_sort(t_list **begin_list, int (*cmp)()) +{ + t_list *current; + t_list *last; + + current = *begin_list; + if (!*begin_list) + return ; + while (current->next) + { + if ((*cmp)(current->content, current->next->content) > 0) + { + if (current != *begin_list) + last->next = current->next; + else + *begin_list = current->next; + ft_lst_swap(¤t); + current = *begin_list; + } + else + { + last = current; + current = current->next ? current->next : current; + } + } +} diff --git a/libft/libft.h b/libft/libft.h index d8b35651..3836b675 100644 --- a/libft/libft.h +++ b/libft/libft.h @@ -81,6 +81,7 @@ void ft_lstadd(t_list **alst, t_list *new); void ft_lstiter(t_list *lst, void (*f)(t_list *elem)); t_list *ft_lstmap(t_list *lst, t_list *(*f)(t_list *elem)); +void ft_lst_sort(t_list **begin_list, int (*cmp)()); void ft_lst_print(t_list *list, void (*printer)()); int ft_lstsize(t_list *lst); void ft_lsteadd(t_list **alst, t_list *new);