
이후 나타나는 t_list 자료형(list)은 다음과 같이 정의되었다.
typedef struct s_list
{
void *content;
struct s_list *next;
} t_list;
t_list *ft_lstnew(void *content)
{
t_list *lst;
lst = (t_list *)malloc(sizeof(t_list));
if (!lst)
return (NULL);
lst->content = content;
lst->next = NULL;
return (lst);
}
void ft_lstadd_front(t_list **lst, t_list *new)
{
new->next = *lst;
*lst = new;
}
int ft_lstsize(t_list *lst)
{
int len;
len = 0;
while (lst)
{
lst = lst->next;
len++;
}
return (len);
}
t_list *ft_lstlast(t_list *lst)
{
if (!lst)
return (NULL);
while (lst->next)
lst = lst->next;
return (lst);
}
void ft_lstadd_back(t_list **lst, t_list *new)
{
t_list *tmp;
if (*lst == NULL)
{
*lst = new;
return ;
}
tmp = *lst;
tmp = ft_lstlast(tmp);
tmp->next = new;
}
void ft_lstdelone(t_list *lst, void (*del)(void *))
{
if (lst == NULL)
return ;
del(lst->content);
free(lst);
}
[Point : free(lst)?]
lst를 free해버리면 lst->next로 가는 주소값을 잃어버리기 때문에 일반적으로는 이에 대한 대책을 마련하고 free해야한다. 하지만 이 함수에서는 거기까지 신경쓰지 않는다.
void ft_lstclear(t_list **lst, void (*del)(void *))
{
t_list *curr;
t_list *next;
curr = *lst;
while (curr)
{
next = curr->next;
ft_lstdelone(curr, del);
curr = next;
}
*lst = NULL;
}
[Point : next = curr->next;]
curr->next를 next라는 리스트에 미리 저장함으로서 연속적인 free와 del을 할 수 있도록 한다.
만약 제일 뒤족 node부터 앞쪽 node로 free, del을 할거라면 굳이 필요한 방법이 아니다.
void ft_lstiter(t_list *lst, void (*f)(void *))
{
t_list *curr;
curr = lst;
while (curr)
{
f(curr->content);
curr = curr->next;
}
}
t_list *ft_lstmap(t_list *lst, void *(*f)(void *), void (*del)(void *))
{
t_list *new;
t_list *curr;
t_list *tmp;
if (!lst || !f)
return (NULL);
if (!(new = ft_lstnew(f(lst->content))))
return (NULL);
curr = new;
lst = lst->next;
while (lst)
{
if (!(tmp = ft_lstnew(f(lst->content))))
{
ft_lstclear(&new, del);
return (NULL);
}
curr->next = tmp;
curr = curr->next;
lst = lst->next;
}
return (new);
}