ft_lstclear 구현

yeonjkim·2021년 5월 23일
0

42seoul-libft

목록 보기
12/43

1. ft_lstclear 용도

* t_list 포인터의 주소를 저장하는 **lst와 list의 content를 삭제하는 함수.
* del()포인터를 입력받아 리스트의 노드들과 노드의 content를 삭제하는 함수.

2. 연결 리스트(linked list)분석

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

  • 링크드 리스트의 제일 첫 노드를 가리키는 포인터가 있다.(하단의 사진에서는 head 변수)

  • 각 노드들은 value를 저장하는 data 변수와 다음 노드의 주소값을 저장하는 포인터 변수 next로 구성된다.

3. *lst == NULL과 lst == NULL의 차이

  • lst가 NULL이면 리스트 자체가 존재하지 않는다는 뜻이다.

  • *lst는 lst의 첫번째 주소, head를 의미하므로 리스트 내에 노드가 존재하지 않는다는 뜻이다.

4. t_list와 ft_lstclear()

  • ft_lstclear 함수에서는 t_list 구조체의 인스턴스가 노드이며, t_list 구조체는 아래와 같다.
typedef struct          s_list
{
        void                    *content;
        struct s_list   *next;

}                                       t_list;
  • 또, ft_lstclear 함수에서 t_list 포인터의 주소를 가리키는 변수가 lst이다. 즉, lst는 t_list 포인터를 가리키며 현재 *lst가 가리키는 곳은 연결 리스트의 제일 첫번째 노드이다. 또, 노드의 content를 삭제를 위한 함수 포인터 del()이 파라미터로 전달된다.

5. ft_lstclear 프로토타입

void	ft_lstclear(t_list **lst, void (del)(void*))
  • t_list **lst : t_list 포인터의 주소를 가리키는 변수
  • void (del)(void*)) : 노드의 content를 제거하기 위한 함수 포인터

6. 구현 시 유의사항

  • lst가 NULL이면 리스트가 존재하지 않는다는 뜻. 이 때에는 삭제할 리스트가 없는 것이므로 return;

  • 노드의 요소(content)와 노드를 삭제할 때, free(lst)한 이후 lst는 그 다음 노드를 가리킬 수 없으므로 그 다음 노드의 주소를 t_list 포인터에 저장해 놓아야 한다.

  • 노드의 요소와 노드를 삭제할 때 이미 구현한 ft_lstdelone() 함수를 이용하는 것이 좋다.

  • del()함수가 NULL이면 lst의 content를 free하는 기능을 수행하지 못하므로 바로 return;

7. 코드 구현

#include "libft.h"

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

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

8. 코드 구현 방법

(1) lst가 NULL이면 삭제할 리스트가 없는 것이므로 return, del이 NULL이면 lst의 content를 free할 수 없으므로 return;
(2) lst가 NULL이 아닐 때까지 lst의 content와 lst를 삭제한다.
(3) 삭제하기 전 t_list
cur 변수에 다음 노드의 주소값을 넣는다.
(4) 이전에 구현한 ft_delone() 함수를 통해 lst의 content를 del()함수를 통해 삭제하고 lst를 free한다.
(5) cur이 가지고 있는 주소값을 lst에 대입해 lst가 다음 노드의 주소를 가리키게 한다.
(6) 3, 4, 5를 반복한다.

하단의 사진 참고

0개의 댓글