linked list 설명
배열(Array) & 연결리스트(Linked List)
해당 페이지에 설명해두었음.
ft_lstmap를 구현하기 위해 libft.h파일에
typedef struct s_list { void *content; struct s_list *next; } t_list;이 구조체를 추가해야한다.
t_list *ft_lstmap(t_list *lst, void *(*f)(void *), void (*del)(void *))
#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);
}
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);
}