ft_lstmap

jaehlee·2025년 4월 27일

Libft

목록 보기
25/26

linked list 설명

배열(Array) & 연결리스트(Linked List)
해당 페이지에 설명해두었음.

ft_lstmap를 구현하기 위해 libft.h파일에

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

이 구조체를 추가해야한다.

1. ft_lstmap란?


기존 리스트의 각 content에 함수 f를 적용한 새 리스트를 만들어 리턴하는 함수이다.

2. 함수 프로토타입

t_list	*ft_lstmap(t_list *lst, void *(*f)(void *), void (*del)(void *))

3. 함수구현

#include "libft.h"

t_list	*ft_lstmap(t_list *lst, void *(*f)(void *), void (*del)(void *))
{
	t_list	*new_list;
	t_list	*new_node;

	if (!lst || !f)
		return (NULL);
	new_list = NULL;
	while (lst)
	{
		new_node = ft_lstnew(f(lst->content));
		if (!new_node)
		{
			ft_lstclear(&new_list, del);
			return (NULL);
		}
		ft_lstadd_back(&new_list, new_node);
		lst = lst->next;
	}
	return (new_list);
}

작동방식

  1. 빈 리스트 new_list를 생성한다
  2. 원본 리스트를 순회하면서 lst->content에 f를 적용해 새로운 content를 만들고 그 content로 새 노드 new_node를 만든다.
  3. 생성 실패 시 지금까지 만든 new_list를 del로 모두 해제하고 NULL을 반환한다.
  4. 성공하면 new_list의 끝에 new_node를 추가하고 최종적으로 생성된 새 리스트 반환한다.

사용예시

void *to_upper_copy(void *content)
{
	char *str = (char *)content;
	char *new_str = strdup(str);
	int i = 0;

	if (!new_str)
		return (NULL);
	while (new_str[i])
	{
		if ('a' <= new_str[i] && new_str[i] <= 'z')
			new_str[i] -= ('a' - 'A');
		i++;
	}
	return (new_str);
}

// content를 free하는 함수
void del(void *content)
{
	free(content);
}

int main(void)
{
	t_list *list = NULL;
	t_list *mapped = NULL;

	list = ft_lstnew(strdup("hello"));
	ft_lstadd_back(&list, ft_lstnew(strdup("world")));
	ft_lstadd_back(&list, ft_lstnew(strdup("libft")));

	mapped = ft_lstmap(list, to_upper_copy, del);

	// 새 리스트(mapped) 출력
	t_list *cur = mapped;
	while (cur)
	{
		printf("%s\n", (char *)cur->content);
		cur = cur->next;
	}

	// 메모리 해제
	ft_lstclear(&list, del);
	ft_lstclear(&mapped, del);

	return (0);
}
profile
공부하는 개발자

0개의 댓글