[42libft] bonus part 총 정리

퐁퐁이·2021년 12월 24일
0

42SEOUL

목록 보기
6/12
post-thumbnail

[Libft] bonus

1) ft_lstnew

: 새로운 노드를 생성하는 함수 (반환 자체는 연결 리스트가 아닌 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의 값에 따라 초기화

변수 nextNULL로 초기화

✏️ parameter

content : 새로운 요소를 만들 content

2) ft_lstadd_front

: 리스트의 시작부분에 요소 new를 추가

void	ft_lstdd_front(t_list **lst, t_list *new)
{
    if (!lst || !new)
        return;
    new->next = *lst;
    *lst = new;
}

✏️ 기존에 있는 리스트에서 맨 앞에 새로운 노드 추가

✏️ paramater

**lst : 첫 번째 링크 리스트의 포인터 주소

*new : 리스트에 추가되기 위한 요소의 포인터 주소

3) ft_lstsize

: 리스트의 노드를 순회하면서 노드의 개수를 세는 함수

int		ft_lstsize(t_list *lst)
{
    size_t size;

    size = 0;
    while (lst)
    {
        lst = lst->next;
        size++;
    }
    return (size);
}

✏️ paramater

*lst : 리스트의 시작

4) ft_lstlast

: 리스트의 마지막 노드를 반환

t_list		*ft_lstlast(t_list *lst)
{
	if (!lst)
		return (0);
	while (lst->next != 0)
		lst = lst->next;
	return (lst);
}

✏️ paramater

*lst : 리스트의 시작

5) ft_lstadd_back

: 리스트 끝에 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 : 새로 추가할 노드의 포인터 주소

6) ft_lstdelone

: 한 개의 노드를 삭제

void	ft_lstdelone(t_list *lst, void (*del)(void *))
{
    if (!lst || !del)
        return;
    del(lst->content);
    free(lst);
}

✏️ 먼저 노드의 contentdel하고 해당 노드를 free함으로써 삭제

✏️ paramater

*lst : free할 노드

(*del)(void *) : content를 삭제하는데 사용 되는 함수 포인터

7) ft_lstclear

: 연결 리스트의 전체 노드 데이터를 삭제하는 함수

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를 삭제하는데 사용되는 함수 포인터

8) ft_lstiter

: 노드를 순회하며 각 노드의 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 *) : 리스트에 반복적으로 사용되는 함수 포인터

9) ft_lstmap

: 노드를 순회하며 각 노드의 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);
}

✏️ 연결리스트 lstcontent를 함수 f로 보내서 바뀐 값을 content로 갖고있는 새로운 연결리스트를 만들어서 리턴해주는 함수

✏️ 새 노드를 동적할당 하다가 실패 할 경우 새로 만들어진 링크드리스트를 싹다 없애라

✏️ paramater

*lst : 노드의 포인터 주소 (매핑을 할 연결리스트)

*(*f)(void *) : 리스트에 반복적으로 사용되는 함수 포인터 (매핑을 할 함수)

(*del)(void *) : 필요한 경우 노드의 content를 삭제하기 위해 사용되는 함수 포인터 (노드 할당 실패시 content를 지워줄 함수)

✏️ 새로 생성된 링크드리스트를 리턴함

profile
코딩하는 에디

0개의 댓글