aboutsummaryrefslogtreecommitdiff
path: root/src/lst/ft_lstbsearch.c
diff options
context:
space:
mode:
authorCharles <sircharlesaze@gmail.com>2020-02-16 04:51:41 +0100
committerCharles <sircharlesaze@gmail.com>2020-02-16 04:51:41 +0100
commit01b4cc91d1596cf94d709a627ed8ad64bc1e285d (patch)
tree8b15a7758247ed4d4a084bccefedbf426ddfd305 /src/lst/ft_lstbsearch.c
parentbf4dc8e5c1dbb8149f0cab473f73b5e9bac24ae0 (diff)
downloadlibft-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.c34
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));
}