typedef struct s_list
{
void *content;
struct s_list *next;
} t_list;
t_list
에 대한 구조체 필드는 위와 같다.content
와 next
변수에 대한 포인터를 가지고 있다.t_list *ft_lstnew(void *content);
#include "libft.h"
t_list *ft_lstnew(void *content)
{
t_list *new;
new = (t_list *)malloc(sizeof(t_list));
if(!new)
return (NULL);
new -> content = content;
new -> next = NULL;
return (new);
}
malloc(3)
를 할당하고 새로운 요소
를 반환하는 함수t_list
의 변수 content
는 매개변수 content
에 따라 초기화하고, next
변수는 NULL
로 초기화한다.void ft_lstadd_front(t_list **lst, t_list *new);
#include "libft.h"
void ft_lstadd_front(t_list **lst, t_list *new)
{
if (!lst || !new)
return ;
new -> next = *lst;
*lst = new;
}
lst
의 시작 위치에 새 요소new
를 추가하는 함수**lst: linked list의 첫 번째 list를 가르키는 포인터 주소
int ft_lstsize(t_list *lst);
#include "libft.h"
int ft_lstsize(t_list *lst)
{
int size;
size = 0;
while (lst != NULL)
{
lst = lst->next;
size++;
}
return (size);
}
lst
가 가지고 있는 요소의 개수를 반환하는 함수lst = lst->next
을 사용한다.t_list *ft_lstlast(t_list *lst);
#include "libft.h"
t_list *ft_lstlast(t_list *lst)
{
if (lst == NULL)
return (NULL);
while (lst->next != NULL)
lst = lst->next;
return (lst);
}
lst
의 마지막 요소
를 반환하는 함수lst->next == NULL
인 경우 while문을 벗어나므로 NULL
이전의 마지막 요소
를 반환하게 된다.void ft_lstadd_back(t_list **lst, t_list *new);
#include "libft.h"
void ft_lstadd_back(t_list **lst, t_list *new)
{
t_list *last;
if (!lst || !new)
return ;
if (*lst == NULL)
{
*lst = new;
return ;
}
last = ft_lstlast(*lst);
new->next = last->next;
last->next = new;
}
lst
의 마지막 위치에 새 요소 new
를 추가하는 함수new
의 다음 주소를 기존 lst
의 다음 주소인 NULL
로 설정lst
의 다음 주소는new
로 설정한다.void ft_lstdelone(t_list *lst, void (*del)(void *));
#include "libft.h"
void ft_lstdelone(t_list *lst, void (*del)(void *))
{
if (lst == NULL)
return ;
del(lst->content);
free(lst);
}
del
을 lst
요소의 content에 적용시킨 후, 요소를 free하는 함수lst->next
는 free
하지 않는다void ft_lstclear(t_list **lst, void (*del)(void*));
#include "libft.h"
void ft_lstclear(t_list **lst, void (*del)(void*))
{
t_list *temp;
t_list *next;
temp = *lst;
while (temp)
{
next = temp->next;
ft_lstdelone(temp, del);
temp = next;
}
*lst = NULL;
}
linked list
전체 노드 데이터를 삭제하는 함수temp
에 노드 입력 -> next
에 temp
의 다음 노드 입력 -> temp
노드 삭제 -> temp
에 next
로 초기화.lst
는 빈 리스트가 되어 쓰레기값이 되므로 NULL
로 초기화 해준다.void ft_lstiter(t_list *lst, void (*f)(void *));
#include "libft.h"
void ft_lstiter(t_list *lst, void (*f)(void *))
{
if (!lst || !f)
return ;
while (lst)
{
f(lst->content);
lst = lst->next;
}
}
lst
를 돌면서 각 요소의 content
변수에 함수 f
를 적용시키는 함수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 *tmp;
t_list *head;
if (lst == NULL || f == NULL)
return (NULL);
head = NULL;
while (lst)
{
if (!(tmp = ft_lstnew((*f)(lst->content))))
{
ft_lstclear(&head, del);
return (NULL);
}
ft_lstadd_back(&head, tmp);
tmp = tmp->next;
lst = lst->next;
}
return (head);
}
lst
인자로 받은 구조체와 연결된 모든 요소의 content
에 f
함수를 적용한 리스트를 복사한 후, 복사한 리스트의 첫번째 구조체의 주소를 반환하는 함수
각 구조체의 content
에 f
함수 적용에 실패했다면, 모든 메모리를 해제한 후 NULL
을 반환해야한다