header?
typedef struct s_list { void *content; struct s_list *next; } t_list;
lstnew
새 리스트 노드를 생성해주는 함수.
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); }
lstiter
linked list에 각 node가 가지고 있는 content에 함수 f를 적용시켜주는 함수.
void ft_lstiter(t_list *lst, void (*f)(void *)) { if (!f) return ; while (lst) { (*f)(lst->content); lst = lst->next; } }
lstsize
linked list가 가지고 있는 노드 수를 세어서 반환해주는 함수.
int ft_lstsize(t_list *lst) { size_t i; i = 0; while (lst) { lst = lst->next; i++; } return (i); }
lstlast
linked list의 맨끝 노드의 주소를 반환해주는 함수.
t_list *ft_lstlast(t_list *lst) { while (lst) { if (!lst->next) return (lst); lst = lst->next; } return (lst); }
lstadd_front
linked list의 노드 주소와, 새 노드의 주소를 받아서
list의 맨 앞에 새 노드 new를 넣어준다.void ft_lstadd_front(t_list **lst, t_list *new) { if (lst) { if (*lst) new->next = *lst; *lst = new; } }
lstadd_back
linked list의 노드 주소와, 새 노드의 주소를 받아서
list의 맨 뒤에 새 노드 new를 넣어준다.void ft_lstadd_back(t_list **lst, t_list *new) { t_list *last; if (lst) { if (*lst) { last = ft_lstlast(*lst); last->next = new; } else *lst = new; } }
lstdelone
이름처럼 노드 하나를 삭제해주는 함수이다.
삭제할 노드 주소와 삭제하는 함수가 매개변수로 들어온다.void ft_lstdelone(t_list *lst, void (*del)(void *)) { if (!lst || !del) return ; (*del)(lst->content); free(lst); }
lstclear
linked list를 모두 순회하며 모든 노드를 삭제하면 된다.
삭제하는 함수는 위에 만들어놓은게 있으므로 (삭제함수 적용과 free까지)
반복하며 적용만해주면 된다.void ft_lstclear(t_list **lst, void (*del)(void *)) { t_list *tmp; if (!del || !lst || !*lst) return ; while (lst && *lst) { tmp = (*lst)->next; ft_lstdelone(*lst, del); *lst = tmp; } }
lstmap
linked list의 노드를 순회하면서
모든 노드의 content에 함수 f를 적용한 후
반환되는 바뀐 값을 content로 갖고있는
새로운 linked list를 만들어서 반환한다.t_list *ft_lstmap(t_list *lst, void *(*f)(void *), void (*del)(void *)) { t_list *prev; t_list *new; if (!lst || !f) return (NULL); prev = NULL; while (lst) { new = ft_lstnew((*f)(lst->content)); if (!new) { ft_lstclear(&prev, del); return (NULL); } ft_lstadd_back(&prev, new); new = new->next; lst = lst->next; } return (prev); }