ft_lstadd_back 구현

yeonjkim·2021년 5월 23일
0

42seoul-libft

목록 보기
10/43

1. ft_lstadd_back 용도

* t_list 연결 리스트 lst의 맨 뒤에 new라는 t_list 노드를 추가하는 함수

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

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

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

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

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

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

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

4. t_list와 ft_lstadd_back()

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

}                                       t_list;
  • 또, ft_lstadd_back 함수에서 t_list 포인터의 주소를 가리키는 변수가 lst이며, 추가할 노드의 주소를 가리키는 t_list 포인터는 new이다. 즉, lst는 t_list 포인터를 가리키며 현재 *lst가 가리키는 곳은 연결 리스트의 제일 첫번째 노드이다.

5. ft_lstadd_back 프로토타입

ft_lstadd_back(t_list **lst, t_list *new)
  • t_list **lst : t_list 포인터의 주소를 가리키는 변수
  • t_list *new : lst의 맨 뒤에 추가할 노드의 주소를 가리키는 포인터 변수

6. 구현 시 유의사항

  • lst에 new를 추가하려고 하는데, 무턱대고 *lst = new를 하면 안된다.

    --> 현재 *lst가 가리키는 값은 연결 리스트의 제일 첫번째 노드의 주소이며, 우리는 연결 리스트의 마지막에 new를 추가하려고 한다. 그렇게 하기 위해서는 *lst가 현재 가리키고 있는 값이 마지막 노드가 되게 한다.

  • lst가 NULL이면 리스트가 존재하지 않고, new가 NULL이면 new노드가 존재하지 않는다는 뜻. 이 때에는 추가할 노드가 없거나 추가할 리스트가 없는 것이므로 return;

  • *lst 가 NULL이고 new가 NULL이 아니면 현재 추가할 노드는 있고 리스트도 존재한다. 그러나 *lst가 NULL이면 제일 첫번째 노드가 존재하지 않는다는 뜻이니 처음 노드부터 탐색할 필요 없이 바로 new를 추가하면 된다.

7. 코드 구현

#include "libft.h"

void            ft_lstadd_back(t_list **lst, t_list *new)
{
        t_list  *res;

        res = *lst;
        if (*lst == NULL && new != NULL)
        {
                *lst = new;
                return ;
        }
        else if (lst == NULL || new == NULL)
        {
                return ;
        }
        while ((*lst)->next != NULL)
        {
                *lst = (*lst)->next;
        }
        (*lst)->next = new;
        *lst = res;
}

8. 코드 구현 방법

(1) 현재 lst != NULL이고 new != NULL이라면 바로 new를 추가한다.
-->
lst에 new의 주소를 넣으면 됨

(2) lst == NULL이거나 new == NULL이면 노드를 리스트에 추가할 수 없으므로 바로 return;

(3) 1, 2번에도 해당되지 않았다면 lst리스트에 new 노드 추가 가능.
lst의 next가 NULL이 아닐 때까지 리스트 탐색.
lst의 next에 new의 주소를 저장.

1개의 댓글

comment-user-thumbnail
2022년 7월 17일

참고 잘했습니다. 8.1번이 잘못 되었네요. lst == NULL 일때 인데 != 라고 적으셨어요~!

답글 달기