: 새로운 노드를 생성하는 함수 (반환 자체는 연결 리스트가 아닌 1개의 노드)
t_list *ft_lstnew(void *content)
{
t_list *new;
new = (t_list *)malloc(sizeof(t_list));
if (!new)
return (0);
new->content = content;
new->next = 0;
return (new);
}
✏️ 노드의 next
에 계속해서 다음 노드를 연결하면 연결 리스트로 사용할 수 있음
`malloc()` 을 할당하고 새로운 요소(노드)를 반환
변수 content
는 매개변수 content
의 값에 따라 초기화
변수 next
는 NULL
로 초기화
✏️ parameter
content
: 새로운 요소를 만들 content
: 리스트의 시작부분에 요소 new
를 추가
void ft_lstdd_front(t_list **lst, t_list *new)
{
if (!lst || !new)
return;
new->next = *lst;
*lst = new;
}
✏️ 기존에 있는 리스트에서 맨 앞에 새로운 노드 추가
✏️ paramater
**lst
: 첫 번째 링크 리스트의 포인터 주소
*new
: 리스트에 추가되기 위한 요소의 포인터 주소
: 리스트의 노드를 순회하면서 노드의 개수를 세는 함수
int ft_lstsize(t_list *lst)
{
size_t size;
size = 0;
while (lst)
{
lst = lst->next;
size++;
}
return (size);
}
✏️ paramater
*lst
: 리스트의 시작
: 리스트의 마지막 노드를 반환
t_list *ft_lstlast(t_list *lst)
{
if (!lst)
return (0);
while (lst->next != 0)
lst = lst->next;
return (lst);
}
✏️ paramater
*lst
: 리스트의 시작
: 리스트 끝에 new
노드 추가
void ft_lstadd_back(t_list **lst, t_list *new)
{
if (!lst || !new)
return;
if (*lst == 0)
*lst = new;
else
(ft_lstlast(*lst))->next = new;
}
✏️ lst
== 0 : 현재 리스트 자체가 없다
`*lst` == 0 : 현재 노드가 없다
✏️ paramater
**lst
: 첫 번째 연결리스트의 포인터 주소
*new
: 새로 추가할 노드의 포인터 주소
: 한 개의 노드를 삭제
void ft_lstdelone(t_list *lst, void (*del)(void *))
{
if (!lst || !del)
return;
del(lst->content);
free(lst);
}
✏️ 먼저 노드의 content
를 del
하고 해당 노드를 free
함으로써 삭제
✏️ paramater
*lst
: free할 노드
(*del)(void *)
: content
를 삭제하는데 사용 되는 함수 포인터
: 연결 리스트의 전체 노드 데이터를 삭제하는 함수
void ft_lstclear(t_list **lst, void (*del)(void *))
{
t_list *tmp;
if (!lst || !del)
return;
while (*lst)
{
tmp = (*lst)->next;
ft_lstdelone(*lst, del);
*lst = tmp;
}
}
✏️ 주어진 노드와 해당 노드의 모든 후속 노드를 삭제하고 free
✏️ 다음 노드를 임시로 보관 → 현재 리스트의 해당 노드 삭제 → 현재 리스트를 다음 노드로 가리킴 → 반복
✏️ paramater
**lst
: 노드의 포인터 주소
(*del)(void *)
: 노드의 content를 삭제하는데 사용되는 함수 포인터
: 노드를 순회하며 각 노드의 content
에 함수 f
함수를 적용
void ft_lstiter(t_list *lst, void (*f)(void *))
{
if (!lst || !f)
return;
while (lst)
{
f(lst->content);
lst = lst->next;
}
}
✏️ paramater
*lst
: 노드의 포인터
(*f)(void *)
: 리스트에 반복적으로 사용되는 함수 포인터
: 노드를 순회하며 각 노드의 content
에 함수 f
를 적용시키고 새로운 리스트를 만든다.
t_list *ft_lstmap(t_list *lst, void *(*f)(void *), void (*del)(void *))
{
t_list *res;
t_list *tmp;
if (!lst || !f)
return (0);
res = 0;
while (lst)
{
tmp = ft_lstnew(f(lst->content));
if (!tmp)
{
ft_lstclear(&res, del);
return (0);
}
ft_lstadd_back(&res, tmp);
tmp = tmp->next;
lst = lst->next;
}
return (res);
}
✏️ 연결리스트 lst
의 content
를 함수 f
로 보내서 바뀐 값을 content
로 갖고있는 새로운 연결리스트를 만들어서 리턴해주는 함수
✏️ 새 노드를 동적할당 하다가 실패 할 경우 새로 만들어진 링크드리스트를 싹다 없애라
✏️ paramater
*lst
: 노드의 포인터 주소 (매핑을 할 연결리스트)
*(*f)(void *)
: 리스트에 반복적으로 사용되는 함수 포인터 (매핑을 할 함수)
(*del)(void *)
: 필요한 경우 노드의 content
를 삭제하기 위해 사용되는 함수 포인터 (노드 할당 실패시 content를 지워줄 함수)
✏️ 새로 생성된 링크드리스트를 리턴함