[libft](3)리스트 함수
이번 포스트는 libft에 내장할 리스트(list)함수에 관한 내용입니다.
libft.h파일에 리스트함수에 사용될 구조체 선언
typedef struct s_list
{
void *content;
struct s_list *next;
} t_list;
- 연결 리스트의 노드는 구조체의 형태를 띠고 있습니다.
- 노드 구조체를
t_list
라고 자료형 이름을 지정하였습니다. void *cotent;
는 각 노드가 저장할 데이터요소입니다.struct s_list *next;
는 다음 노드의 주소를 저장할 포인터로 이 포인터가 각노드의 연결고리 역할을 하게 됩니다.
자세한내용 >[C]연결리스트(linked list)
1️⃣lstnew
- lstnew함수는 첫 노드를 생성하는 함수입니다.
< 함수구현 >
t_list *ft_lstnew(void *content)
{
t_list *result;
if (!(result = (t_list *)malloc(sizeof(t_list))))
return (0);
result->content = content;
result->next = NULL;
return (result);
}
2️⃣ lstadd_front
- lstadd_front함수는 앞쪽에 새로운 노드를 추가하는 함수입니다.
< 함수구현 >
void ft_lstadd_front(t_list **lst, t_list *new)
{
new->next = *lst;
*lst = new;
}
3️⃣ lstadd_back
- lstadd_back함수는 뒤쪽에 새로운 노드를 추가하는 함수입니다.
< 함수구현 >
void ft_lstadd_back(t_list **lst, t_list *new)
{
if (*lst == 0)
*lst = new;
else
(ft_lstlast(*lst))->next = new;
}
4️⃣ lstsize
- lstsize함수는 노드의 갯수를 새어주는 함수입니다.
< 함수구현 >
int ft_lstsize(t_list *lst)
{
size_t size;
size = 0;
while (lst)
{
lst = lst->next;
size++;
}
return (size);
}
5️⃣ lstlast
- lstlast함수는 마지막 노드의 주소를 출력해주는 함수입니다.
< 함수구현 >
t_list *ft_lstlast(t_list *lst)
{
if (!lst)
return (0);
while (lst->next)
lst = lst->next;
return (lst);
}
6️⃣ lstiter
- lstiter함수는 노드의 모든 요소에 *지정한 함수**를 적용시키는 함수입니다.
< 함수구현 >
void ft_lstiter(t_list *lst, void (*f)(void *))
{
while (lst)
{
f(lst->content);
lst = lst->next;
}
}
7️⃣ lstdelone
- lstdelone함수는 특정 노드를 삭제하는 함수입니다.
< 함수구현 >
void ft_lstdelone(t_list *lst, void (*del)(void *))
{
del(lst->content);
free(lst);
}
8️⃣ lstclear
- lstclear함수는 모든 노드를 삭제하는 함수 입니다.
< 함수구현 >
void ft_lstclear(t_list **lst, void (*del)(void *))
{
t_list *tmp;
while (*lst)
{
tmp = (*lst)->next;
del((*lst)->content);
free(*lst);
*lst = tmp;
}
*lst = 0;
}
9️⃣ lstmap
- lstmap함수는 연결리스트의 노드요소들을 지정한 함수를 적용하여 새로운 리스트와 노드에 복사하는 함수입니다.
< 함수구현 >
t_list *ft_lstmap(t_list *lst, void *(*f)(void *), void (*del)(void *))
{
t_list *result;
t_list *curr;
if (!lst || !f || !(result = ft_lstnew(f(lst->content))))
return (0);
curr = result;
lst = lst->next;
while (lst)
{
if (!(curr->next = ft_lstnew(f(lst->content))))
{
ft_lstclear(&result, del);
return (0);
}
curr = curr->next;
lst = lst->next;
}
return (result);
}