42Seoul/libft

libft Bonus - lstdelone, lstclear, lstiter, lstmap

재윤 2023. 3. 24. 14:23
반응형

lstdelone

void	ft_lstdelone(t_list *lst, void (*del)(void *))

현재 가리키고 있는 노드를 삭제 시킴.

free lst와 free content

#include "libft.h"

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

참고 사이트

ft_lstdelone 구현

 

ft_lstdelone 구현

lst가 NULL이면 리스트가 비어 있다는 뜻. 이 때에는 삭제할 리스트가 없는 것이므로 return; del()함수가 NULL이면 lst의 content를 free하는 기능을 수행하지 못하므로 바로 return;

velog.io

 

 

lstclear

현재 가리키고 있는 노드부터 뒤에 다 삭제하기 

#include "libft.h"

void	ft_lstdelone(t_list *lst, void (*del)(void *));

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

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

 

참고 사이트

ft_lstclear 구현

 

ft_lstclear 구현

lst가 NULL이면 리스트가 존재하지 않는다는 뜻. 이 때에는 삭제할 리스트가 없는 것이므로 return; 노드의 요소(content)와 노드를 삭제할 때, free(lst)한 이후 lst는 그 다음 노드를 가리킬 수 없으므로

velog.io

 

lstiter

노드에 f함수를 적용시키기

#include "libft.h"

void	ft_lstiter(t_list *lst, void (*f)(void *))
{
	t_list	*temp;

	temp = lst;
	while (temp)
	{
		(*f)(temp->content);
		temp = temp -> next;
	}
}

 

참고 사이트

ft_lstiter 구현

 

ft_lstiter 구현

연결 리스트는 배열과 같은 선형 자료구조로, 하단의 사진과 같이 노드들이 메모리 상에 연속적으로 저장되어 있지 않고 포인터로 연결되어 있는 리스트이다.링크드 리스트의 제일 첫 노드를

velog.io

 

lstmap

lst를 받아와서 lst가 존재할 때까지 복사를 한다고 생각하면 됨

  1. temp에 새로운 노드 추가
  2. temp 노드 생성 실패시 del와 clear를 사용해서 삭제
  3. 생성된 temp 노드에 content f함수로 적용
  4. temp와 result = NULL라는 것을 주어서 back에 저장temp끼리 주소값 연결
  5. 초기값 result에 temp 노드들을 다 저장
  6. temp 주소에 마지막에 NULL 추가 temp끼리 적용하는 건 back에서 함

#include "libft.h"

t_list	*ft_lstnew(void *content);
void	ft_lstclear(t_list **lst, void (*del)(void *));
void	ft_lstadd_back(t_list **lst, t_list *new);
void	ft_lstdelone(t_list *lst, void (*del)(void *));

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

	result = NULL;
	while (lst)
	{
		temp = (t_list *)malloc(sizeof(t_list));
		if (!temp)
		{
			ft_lstclear(&result, del);
			return (0);
		}
		temp->content = (*f)(lst->content);
		ft_lstadd_back(&result, temp);
		temp->next = 0;
		lst = lst->next;
	}
	return (result);
	// t_list		*result;
	// t_list		*temp;
	// t_list		*mew;

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

참고 사이트

ft_lstmap 구현

 

ft_lstmap 구현

lst가 NULL이면 리스트가 비어 있다는 뜻. lst의 content를 이용해야 하나 lst가 비어 있으므로 NULL을 리턴해 주면 됨. 이 부분은 따로 구현하지 않았고, lst가 NULL이면 while문을 돌지 않고 node가 NULL인 채

velog.io

 

반응형