〖Libft〗 ④

hyeonjin-dot·2021년 1월 25일
1

42seoul

목록 보기
5/7

Bonus part

  • 보너스 파트는 구조체를 활용하여 함수를 구현하는 것이다.
typedef struct	s_list
{
	void		*content;
    	struct s_list	*next;
}			t_list;

위가 주어진 구조체의 프로토 타입이고, 이 구조체를 활용해야한다.

ft_lstmap

t_list *ft_lstmap(t_list *lst, void *(*f)(void*), void (*del)(void*));
이 함수는 리스트 'lst'를 반복하여 각 요소의 content에 함수 'f'를 적용시켜 새로운 리스트를 만드는 것이다.
필요의 경우, 함수 'del'을 활용하여 요소의 content를 삭제하는데 사용할 수 있다.

이 함수를 구현하는데, 보너스 파트의 다른 함수들을 활용하였다.

  • ft_lstnew
  • ft_lstclear
  • ft_lstadd_back

이 세가지 함수를 활용하였는데,

간단히 소개를 하고 가자면

ft_lstnew

t_list *ft_lstnew(void *content);
구조체에 새로운 content를 입력하는 것이다. void *content에 해당하는 부분을 구조체의 content에 입력하는 것이다.

t_list new;

new->content = content;
new->next = NULL;

이런 방식으로 새로운 구조체의 내용을 넣는다. (할당 내용은 생략. 그러나 꼭 필요한 부분)

ft_lstclear

void ft_lstclear(t_list **list, void (*del)(void*));
함수 del을 활용하여 주어진 요소와 후속 요소들을 모두 삭제하는 함수이다.

포인터의 주소를 사용하기 때문에, 이중포인터를 사용한다.

ft_lstadd_back

void ft_lstadd_back(t_list **list, t_list *new);
기존 list에 new라는 구조체를 붙여주는 것이다.
만약 list가 아무 것도 존재하지 않는 구조체인 경우

if (!*lst)
{
	*lst = new;
	return ;
}

new를 그냥 list에 넣어준다.

그러나 list가 빈 구조체가 아닌 경우, 구조체의 끝으로 가서
new의 내용을 추가(연결)해 준다.

t_list tmp;

tmp = ft_lstlast(*lst); // ft_lstlast()는 구조체의 마지막 요소를 찾아주는 함수
tmp->next = new;

즉, ft_lstmap에서는
ft_lstnew로 함수 f를 활용한 내용을 만들고,
함수로 생성한 내용에 문제가 있는 경우, ft_lstclear로 생성한 모든 구조체를 지운뒤, 함수를 끝낸다.
문제가 없는 경우에 ft_lstadd_back을 활용하여, 이전에 생성한 구조체 뒤에 붙여주는 과정을 반복한다.

profile
응애 나 애기 블로거

0개의 댓글