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



이전포스트 > [libft](2)내장함수 구현

다음포스트 > [libft](4)Makefile





© 2021.02. by kirim

Powered by kkrim