[libft] Bonus

James An·2020년 12월 31일
0

42SEOUL

목록 보기
3/11
post-thumbnail

0. 구조체 선언

typedef struct		s_list
{
	void		*content; 
    struct s_list	*next;
}			t_list;
  • t_list에 대한 구조체 필드는 위와 같다.
  • contentnext 변수에 대한 포인터를 가지고 있다.

1. lstnew

Prototype

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);
}

Description

  • malloc(3)를 할당하고 새로운 요소를 반환하는 함수
  • t_list의 변수 content는 매개변수 content에 따라 초기화하고, next 변수는 NULL로 초기화한다.

2. lstadd_front

Prototype

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;
}

Description

  • lst의 시작 위치에 새 요소new를 추가하는 함수
  • **lst: linked list의 첫 번째 list를 가르키는 포인터 주소

3. lstsize

Prototype

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);
}

Description

  • lst가 가지고 있는 요소의 개수를 반환하는 함수
  • 다음 요소로 이동하려면 lst = lst->next을 사용한다.

4. lstlast

Prototype

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);
}

Description

  • lst마지막 요소를 반환하는 함수
  • lst->next == NULL인 경우 while문을 벗어나므로 NULL 이전의 마지막 요소를 반환하게 된다.

5. lstadd_back

Prototype

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;
}

Description

  • lst의 마지막 위치에 새 요소 new를 추가하는 함수
  • new의 다음 주소를 기존 lst의 다음 주소인 NULL로 설정
  • lst의 다음 주소는new로 설정한다.

6. lstdelone

Prototype

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);
}

Description

  • 매개변수로 주어진 함수 dellst 요소의 content에 적용시킨 후, 요소를 free하는 함수
  • 다음 요소인 lst->nextfree하지 않는다

7. lstclear

Prototype

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;
}

Description

  • linked list 전체 노드 데이터를 삭제하는 함수
  • temp에 노드 입력 -> nexttemp의 다음 노드 입력 -> temp 노드 삭제 -> tempnext로 초기화.
  • lst는 빈 리스트가 되어 쓰레기값이 되므로 NULL로 초기화 해준다.

8. lstiter

Prototype

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;
    }
}

Description

  • lst를 돌면서 각 요소의 content 변수에 함수 f를 적용시키는 함수

9.

Prototype

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);
}

Description

  • lst인자로 받은 구조체와 연결된 모든 요소의 contentf함수를 적용한 리스트를 복사한 후, 복사한 리스트의 첫번째 구조체의 주소를 반환하는 함수

  • 각 구조체의 contentf함수 적용에 실패했다면, 모든 메모리를 해제한 후 NULL을 반환해야한다

profile
born 2 code :)

0개의 댓글