-
Notifications
You must be signed in to change notification settings - Fork 0
/
ft_list_lib_util_bonus.c
69 lines (62 loc) · 1.26 KB
/
ft_list_lib_util_bonus.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
/* ************************************************************************** */
/**//**//*****//**//* By: *//**//* Created: by *//* Updated: by *//**/
/* ************************************************************************** */
#include "libft.h"
#include <stdlib.h>
void ft_lstdelone(t_list *lst, void (*del)(void *))
{
if (lst)
{
if (del)
del(lst->content);
free(lst);
}
}
void ft_lstclear(t_list **lst, void (*del)(void *))
{
t_list *next;
if (!lst || !del)
return ;
while (*lst)
{
next = (*lst)->next;
ft_lstdelone(*lst, del);
*lst = next;
}
}
void ft_lstiter(t_list *lst, void (*f)(void *))
{
if (!lst || !f)
return ;
while (lst)
{
f(lst->content);
lst = lst->next;
}
}
t_list *ft_lstmap(t_list *lst, void *(*f)(void *), void (*del)(void *))
{
t_list temp[3];
void *f_temp;
if (!lst || !f)
return (NULL);
temp[head].next = NULL;
while (lst)
{
f_temp = f(lst->content);
temp[fresh].next = ft_lstnew(f_temp);
if (!temp[fresh].next)
{
free(f_temp);
ft_lstclear(&temp[head].next, del);
return (NULL);
}
if (!temp[head].next)
temp[head].next = temp[fresh].next;
else
temp[follow].next->next = temp[fresh].next;
temp[follow].next = temp[fresh].next;
lst = lst->next;
}
return (temp[head].next);
}