[libft] bonus

probehub·2021년 5월 10일

libft

목록 보기
3/3
post-thumbnail

[t_list]

이후 나타나는 t_list 자료형(list)은 다음과 같이 정의되었다.

typedef struct		s_list
{
	void		*content;
	struct s_list	*next;
}			t_list;

[ft_lstnew]

  • 원형 : t_list *ft_lstnew(void *content)
  • 정의 : 주어진 content를 새로운 t_list형 자료에 넣기.
  • 반환 값 : content가 채워진 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);
}

[ft_lstadd_front]

  • 원형 : void ft_lstadd_front(t_list **lst, t_list *new)
  • 정의 : new를 list의 시작주소에 넣어라.(즉, new가 node의 가장 첫 원소가 되어야 함)
  • 반환 값 : 없음
void	ft_lstadd_front(t_list **lst, t_list *new)
{
	new->next = *lst;
	*lst = new;
}

[ft_lstsize]

  • 원형 : int ft_lstsize(t_list *lst))
  • 정의 : 리스트의 시작주소 lst가 주어졌을때, list의 크기를 구하라
  • 반환 값 : list의 크기
int		ft_lstsize(t_list *lst)
{
	int	len;

	len = 0;
	while (lst)
	{
		lst = lst->next;
		len++;
	}
	return (len);
}

[ft_lstlast]

  • 원형 : t_list *ft_lstlast(t_list *lst)
  • 정의 : 리스트의 시작주소 lst가 주어졌을때, list의 마지막 원소의 주소값을 반환하라.
  • 반환 값 : 마지막 원소의 주소값
t_list	*ft_lstlast(t_list *lst)
{
	if (!lst)
		return (NULL);
	while (lst->next)
		lst = lst->next;
	return (lst);
}

[ft_lstadd_back]

  • 원형 : void ft_lstadd_back(t_list **lst, t_list *new)
  • 정의 : 리스트의 시작주소 *lst가 주어졌을 때 마지막 가 new가 되도록 하라.
  • 반환 값 : 없음
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;
}

[ft_lstdelone]

  • 원형 : void ft_lstdelone(t_list lst, void (del)(void *))
  • 정의 : lst는 free하려는 원소이며, del은 content를 삭제하기 위한 함수이다. lst의 content를 삭제하고, lst를 free하라. lst->next 는 건드리면 안된다.
  • 반환 값 : 없음
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해야한다. 하지만 이 함수에서는 거기까지 신경쓰지 않는다.

[ft_lstclear]

  • 원형 : void ft_lstclear(t_list **lst, void (del)(void ))
  • 정의 : 주어진 list의 시작 주소값 *lst에서 부터 해당 lst가 끝나는 구간까지 모두다 free하고 content를 del하라.
  • 반환 값 : 없음
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을 할거라면 굳이 필요한 방법이 아니다.

[ft_lstiter]

  • 원형 : void ft_lstiter(t_list *lst, void (*f)(void *))
  • 정의 : 연속적인 원소들의 모든 content에 대해 f를 적용하라.
  • 반환 값 : 없음
void	ft_lstiter(t_list *lst, void (*f)(void *))
{
	t_list *curr;

	curr = lst;
	while (curr)
	{
		f(curr->content);
		curr = curr->next;
	}
}

[ft_lstmap]

  • 원형 : t_list*ft_lstmap(t_list *lst, void *(*f)(void ), void (del)(void *))
  • 정의 : lst부터 연속적인 원소들의 모든 content에 대해 f를 적용하고, 적용 결과를 반영한 새로운 list를 만들어 반환하라. 만약 필요하다면 del을 이용하라.
  • 반환 값 : f가 적용된 content를 갖는 새로운 list
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);
}
profile
개발자

0개의 댓글