[libft] ft_lstnew
lstnew?
typedef struct s_list
{
void *content;
struct s_list *next;
} t_list;
//원 함수 없음
t_list *ft_lstnew(void *content);
구현해야할 함수 기능
: Allocates (with malloc(3)) and returns a new element. The variable ’content’ is initialized with the value of the parameter ’content’. The variable ’next’ is initialized to NULL.
해석 및 부연설명
: 새로운 리스트 원소를 생성하여 할당하여 반환한다. 이 때 원소의 변수 content는 인자로 받아온 매개변수로 초기화되어야하고, 변수 next는 NULL
로 초기화되어야한다.
ex)
t_list *new;
new = ft_lstnew("abcde");
printf("%s\n", (char *)new->content);
}
코드 실행 결과
abcde
리스트 new가 정상적으로 생성되었다.
의문점 및 생각해볼점
구조체에 관해
공부하기 매우 좋은 링크
링크 중간에 나와있듯이, 알기쉽게 구조체 = 각 원소의 타입이 제각각인 배열이라고 생각하면 편한 것 같다. 물론 진짜 배열은 아니기에 구조체 이름은 배열과 같이 주소로써 사용할 수 없다.
- . 과 -> 의 차이점
.
연산자는 구조체 자체에서 멤버에 접근할 때 사용하고,->
연산자는 구조체 포인터를 통해 멤버에 접근할 때 사용한다.
linked list
연결 리스트란 배열과 같이 데이터들을 저장하는 자료구조이다.
다만 미리 특정한 공간을 확보해 사용하는 배열과는 달리 연결 리스트는 그 길이를 가변적으로 활용할 수 있다는 장점이 있다.
배열은 할당받은 메모리가 연속적이지만, 연결 리스트는 리스트의 각 노드(연결 리스트에서 데이터를 갖고있는 데이터의 묶음, 쉽게 말해 연결 리스트의 각 원소)가 할당받은 메모리가 연속되어있지 않을 수 있기 때문에 다음 원소를 가리키는 포인터 등을 사용하여 노드들을 연결한다.
따라서 데이터의 탐색이나 변경시 바로 지정된 위치로 이동하면 되는 배열과는 달리 연결 리스트는 각 노드들을 순서대로 쫓아가야하므로 비효율적일 수 있다.
ft_lstnew 구현
t_list *ft_lstnew(void *content)
{
t_list *new;
new = (t_list *)malloc(sizeof(t_list));
if (!new)
return (NULL);
new->content = content;
new->next = NULL;
return (new);
}
구조체 포인터 new 를 선언하여 구조체 크기만큼 할당한 후, ->
연산자로 구조체 포인터의 멤버에 접근하여 content 변수와 next변수를 각각 함수에서 지정된 값으로 채웠다.