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가 정상적으로 생성되었다.

의문점 및 생각해볼점

  1. 구조체?
  2. 연결 리스트?

구조체에 관해

공부하기 매우 좋은 링크
링크 중간에 나와있듯이, 알기쉽게 구조체 = 각 원소의 타입이 제각각인 배열이라고 생각하면 편한 것 같다. 물론 진짜 배열은 아니기에 구조체 이름은 배열과 같이 주소로써 사용할 수 없다.

  • .-> 의 차이점
    . 연산자는 구조체 자체에서 멤버에 접근할 때 사용하고, -> 연산자는 구조체 포인터를 통해 멤버에 접근할 때 사용한다.

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변수를 각각 함수에서 지정된 값으로 채웠다.