42Seoul/Libft

[42Seoul][Libft] 나만의 라이브러리 만들기 - bonus part [C]

목차
Libft
bonus part

ft_lstnew
ft_lstadd_front
ft_lstsize
ft_lstlast
ft_lstadd_back
ft_lstdelone
ft_lstclear
ft_lstiter
ft_lstmap

 

 

Libft bonus part

 보너스 과제에서 사용할 리스트 구조체 입니다. 해당 구조체는 컨텐츠와 다음 구조체를 가리키는 포인터로 구성되어있습니다. 헤더파일에 작성해줍니다.

typedef struct s_list
{
	void			*content;
	struct s_list	*next;
}t_list;

 

ft_lstnew

 연결 리스트에서 새로운 노드를 만드는 함수입니다. 새로운 노드를 만들고 그 노드 값에 우리가 매개변수로 넣어준 값을 해당 새로운 노드에 값으로 넣어줍니다. 새롭게 생성하기만 하는 함수이기에 next 에 NULL 값으로 채워넣습니다. 리턴값은 해당 노드입니다.

#include "libft.h"

t_list	*ft_lstnew(void *content)
{
	t_list	*new_node;

	new_node = (t_list *)malloc(sizeof(t_list));
	if (new_node == 0)
		return (NULL);
	new_node->content = content;
	new_node->next = NULL;
	return (new_node);
}


ft_lstadd_front

 이중 포인터로 들어오는 값이 리스트 형태인데, 가리키는 리스트에 새로운 노드를 붙여줍니다. 코드를 보면, 새로운 노드의 next 포인터 값에 현재 연결리스트의 포인터로 설정합니다. 그리고 그 연결리스트 포인터를 새로운 노드값으로 설정합니다.

#include "libft.h"

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

 

ft_lstsize

 해당 리스트의 사이즈를 구하는 함수입니다. 매개변수로 리스트를 넣고, 그 리스트의 크기 만큼 while 문을 돌려 사이즈를 구할 수 있게 합니다. while 문을 다 돌고나서 len 값을 반환합니다.

#include "libft.h"

int	ft_lstsize(t_list *lst)
{
	int	len;

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

 

ft_lstlast

 해당 리스트의 마지막 노드를 반환하는 함수입니다. while문을 쭉 돌려 마지막 노드 값이 반환되도록 했습니다.

#include "libft.h"

t_list	*ft_lstlast(t_list *lst)
{
	t_list	*prev;

	if (lst == 0)
		return (lst);
	while (lst)
	{
		prev = lst;
		lst = lst->next;
	}
	return (prev);
}

 

ft_lstadd_back

 해당 리스트 뒤에 노드를 추가하는 함수입니다. 리스트와 노드 값이 없을 경우에 return ; 로 가드해주었고, 해당 리스트는 있지만 첫 번째 노드가 없을 경우에 새로운 노드로 설정해주었습니다. 반면 노드가 없을 경우에 마지막 노드가 가리키는 포인터 변수에 새로운 노드로 설정해줍니다.

#include "libft.h"

void	ft_lstadd_back(t_list **lst, t_list *new)
{
	if (lst == 0 || new == 0)
		return ;
	if (*lst == 0)
		*lst = new;
	else
		ft_lstlast(*lst)->next = new;
}

 


ft_lstdelone

  해당 리스트에서 한 개의 노드를 삭제하는 함수입니다. 삭제하고자 하는 노드 값의 컨텐츠를 지우고 해당 노드를 free 해줍니다.

#include "libft.h"

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


ft_lstclear

 해당 리스트 안의 노드 값을 모두 초기화하는 함수입니다. 노드 하나하나를 초기화 하기위해 while문을 돌려 모두 초기화 합니다. 삭제할 노드 값에 다음 노드 값에 대한 정보를 가지고 있기 때문에 포인터 값에 임시로 저장해주고 아래처럼 쓰이게 다음 노드로 설정해줍니다.

#include "libft.h"

void	ft_lstclear(t_list **lst, void (*del)(void*))
{
	t_list	*next;

	if (lst == 0 || del == 0)
		return ;
	while (*lst)
	{
		next = (*lst)->next;
		ft_lstdelone(*lst, del);
		*lst = next;
	}
}

 

 

ft_lstiter

 리스트안의 모든 노드에 함수 값을 적용시킵니다. 리스트 노드 값이 없을때까지 while 문을 순회하며 f함수를 적용시킵니다.

#include "libft.h"

void	ft_lstiter(t_list *lst, void (*f)(void *))
{
	if (lst == 0 || f == 0)
		return ;
	while (lst != 0)
	{
		(*f)(lst->content);
		lst = lst->next;
	}
}

 

ft_lstmap

 새로운 리스트를 만드는 함수입니다. 해당 리스트에 있는 노드를 순회하며 새로운 리스트를 만들고 f함수를 적용합니다. 리스트를 만들던 중 새로운 노드를 만드는 것이 실패하면 여태까지 만들던 리스트를 모두 삭제하고 널값 처리합니다. 마지막으로, 여태까지 만든 리스트를 반환합니다.

#include "libft.h"

t_list	*ft_lstmap(t_list *lst, void *(*f)(void *), void (*del)(void *))
{
	t_list	*result;
	t_list	*new;

	if (lst == 0)
		return (NULL);
	result = 0;
	while (lst)
	{
		new = ft_lstnew((*f)(lst->content));
		if (new == 0)
		{
			ft_lstclear(&result, del);
			return (NULL);
		}
		ft_lstadd_back(&result, new);
		lst = lst->next;
	}
	return (result);
}

 

 


 

 

'42Seoul > Libft' 카테고리의 다른 글

[42Seoul][Libft] 나만의 라이브러리 만들기 [C]  (0) 2022.02.10