diff --git a/libftasm/ft_lst_sort.c b/libftasm/ft_lst_sort.c new file mode 100644 index 00000000..905aa624 --- /dev/null +++ b/libftasm/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/libftasm/libft.h b/libftasm/libft.h index d8b35651..3836b675 100644 --- a/libftasm/libft.h +++ b/libftasm/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);