From aa9613efb6fb39bd96fc4836b5d38c3746af1b15 Mon Sep 17 00:00:00 2001 From: Charles Date: Thu, 30 Jan 2020 10:36:49 +0100 Subject: hash table draft --- src/lst/ft_lstbsearch.c | 56 +++++++++++++++++++++++++++++++++++++++++++++++ src/lst/ft_lstremove_if.c | 32 +++++++++++++++++++++++++++ 2 files changed, 88 insertions(+) create mode 100644 src/lst/ft_lstbsearch.c create mode 100644 src/lst/ft_lstremove_if.c (limited to 'src/lst') diff --git a/src/lst/ft_lstbsearch.c b/src/lst/ft_lstbsearch.c new file mode 100644 index 0000000..6af9cae --- /dev/null +++ b/src/lst/ft_lstbsearch.c @@ -0,0 +1,56 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_lstbsearch.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cacharle +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/01/30 09:17:51 by cacharle #+# #+# */ +/* Updated: 2020/01/30 09:17:53 by cacharle ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +static t_list *st_lstmiddle(t_list *lst, t_list) +{ + t_list *slow; + t_list *fast; + + if (lst == NULL) + return (NULL); + slow = lst; + fast = lst; + while (fast != last) + { + fast = fast->next; + if (fast == NULL) + break; + slow = slow->next; + fast = fast->next; + } + return (slow); +} + +static t_list *st_lstbsearch_rec(t_list *lst, t_list *last, + t_ftbool (*equal)(void *ref, void *content), void *ref) +{ + t_list *mid; + t_list *left; + + if (lst == NULL) + return (NULL); + if ((*equal)(lst->content)) + return (lst); + mid = st_lstmiddle(lst, last); + left = ft_lstbsearch_rec(lst->next, mid, equal)); + if (left != NULL) + return (left); + return (ft_lstbsearch_rec(mid, NULL, equal)); +} + +t_list *ft_lstbsearch(t_list *lst, + t_ftbool (*equal)(void *ref, void *content), void *ref) +{ + return (ft_lstbsearch_rec(lst, NULL, equal)); +} diff --git a/src/lst/ft_lstremove_if.c b/src/lst/ft_lstremove_if.c new file mode 100644 index 0000000..2fa06a3 --- /dev/null +++ b/src/lst/ft_lstremove_if.c @@ -0,0 +1,32 @@ +/* ************************************************************************** */ +/* */ +/* ::: :::::::: */ +/* ft_lstremove_if.c :+: :+: :+: */ +/* +:+ +:+ +:+ */ +/* By: cacharle +#+ +:+ +#+ */ +/* +#+#+#+#+#+ +#+ */ +/* Created: 2020/01/30 09:36:49 by cacharle #+# #+# */ +/* Updated: 2020/01/30 09:55:47 by cacharle ### ########.fr */ +/* */ +/* ************************************************************************** */ + +#include "libft.h" + +void ft_lstremove_if(t_list **lst, + t_ftbool (*equal)(void *ref, void *content), void *ref, + void (*del)(void *content)) +{ + t_list *saved_next; + + if (lst == NULL || *lst == NULL) + return ; + if (!equal(ref, &(*lst)->val)) + { + ft_lstremove_if(&(*lst)->next, equal, ref, del); + return ; + } + saved_next = (*lst)->next; + ft_lstdelone(*lst, del); + *lst = saved_next; + ref_ft_list_remove_if(lst, equal, ref, del); +} -- cgit