[42Seoul] libft - LinkedList 관련 함수

skyju·2022년 4월 27일
1

libft

목록 보기
3/3

LinkedList 관련 함수(bonus)

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);
}
profile
https://github.com/skyju

0개의 댓글