diff options
| author | Charles <sircharlesaze@gmail.com> | 2020-02-16 04:51:41 +0100 |
|---|---|---|
| committer | Charles <sircharlesaze@gmail.com> | 2020-02-16 04:51:41 +0100 |
| commit | 01b4cc91d1596cf94d709a627ed8ad64bc1e285d (patch) | |
| tree | 8b15a7758247ed4d4a084bccefedbf426ddfd305 /src/lst/ft_lstbsearch.c | |
| parent | bf4dc8e5c1dbb8149f0cab473f73b5e9bac24ae0 (diff) | |
| download | libft-01b4cc91d1596cf94d709a627ed8ad64bc1e285d.tar.gz libft-01b4cc91d1596cf94d709a627ed8ad64bc1e285d.tar.bz2 libft-01b4cc91d1596cf94d709a627ed8ad64bc1e285d.zip | |
Filled lst* tests
Diffstat (limited to 'src/lst/ft_lstbsearch.c')
| -rw-r--r-- | src/lst/ft_lstbsearch.c | 34 |
1 files changed, 21 insertions, 13 deletions
diff --git a/src/lst/ft_lstbsearch.c b/src/lst/ft_lstbsearch.c index 25a7b4c..68dc43b 100644 --- a/src/lst/ft_lstbsearch.c +++ b/src/lst/ft_lstbsearch.c @@ -6,7 +6,7 @@ /* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */ /* +#+#+#+#+#+ +#+ */ /* Created: 2020/01/30 09:17:51 by cacharle #+# #+# */ -/* Updated: 2020/01/31 10:42:22 by cacharle ### ########.fr */ +/* Updated: 2020/02/16 04:40:16 by cacharle ### ########.fr */ /* */ /* ************************************************************************** */ @@ -25,7 +25,7 @@ static t_ftlst *st_lstmiddle(t_ftlst *lst, t_ftlst *last) while (fast != last) { fast = fast->next; - if (fast == NULL) + if (fast == last) break ; slow = slow->next; fast = fast->next; @@ -34,24 +34,32 @@ static t_ftlst *st_lstmiddle(t_ftlst *lst, t_ftlst *last) } static t_ftlst *st_lstbsearch_rec(t_ftlst *lst, t_ftlst *last, - t_ftbool (*equal)(void *ref, void *content), void *ref) + t_ftcompar_func cmp, const void *ref) { + int res; t_ftlst *mid; - t_ftlst *left; if (lst == NULL) return (NULL); mid = st_lstmiddle(lst, last); - if ((*equal)(ref, mid->content)) - return (mid); - left = st_lstbsearch_rec(lst, mid, equal, ref); - if (left != NULL) - return (left); - return (st_lstbsearch_rec(mid, NULL, equal, ref)); + if (mid == NULL) + return NULL; + if (mid->next == NULL) + { + if (cmp(ref, mid->content) == 0) + return (mid); + return NULL; + } + res = cmp(ref, mid->next->content); + if (res < 0) + return (st_lstbsearch_rec(lst, mid, cmp, ref)); + else if (res > 0) + return (st_lstbsearch_rec(mid->next->next, NULL, cmp, ref)); + return (mid->next); } -t_ftlst *ft_lstbsearch(t_ftlst *lst, - t_ftbool (*equal)(void *ref, void *content), void *ref) +t_ftlst *ft_lstbsearch(t_ftlst *lst, t_ftcompar_func cmp, + const void *ref) { - return (st_lstbsearch_rec(lst, NULL, equal, ref)); + return (st_lstbsearch_rec(lst, NULL, cmp, ref)); } |
