혹시나 문제가 된다면 바로 비공개 처리하겠습니다. 지적이나 댓글 환영합니다!
이번 포스팅에서는 보너스 파트의 함수를 이어서 구현해보았다. 보너스 파트는 연결리스트(랑크드리스트)를 이용한 기본적인 기능을 구현한 함수들을 구현하였다. 이후에도 많이 사용하게 될 것 같다.
참고로, 내가 정의한 libft.h 헤더에는 <unistd.h>와 <stdlib.h>가 include 되어있다. 따라서 libft.h를 호출하면, 따로 정의하지 않고도 <unistd.h> 에 정의된 size_t 타입과 <stdlib.h>의 malloc/free를 사용할 수 있다. 또한 <unistd.h>에 있는 write 함수 또한 사용할 수 있다. 또한 t_list 구조체도 정의하여, 보너스 함수 구현에 이를 사용하였다.
(1) ft_lstdelone : 주어진 노드를 삭제
- 구현 코드 예시 :
1
2
3
4
5
6
7
8
|
#include "libft.h"
void ft_lstdelone(t_list *lst, void (*del)(void *))
{
(del)(lst->content);
free(lst);
}
|
cs |
- del() 함수를 통해 주어진 노드의 content를 삭제한다.
- free()를 통해 주어진 노드의 메모리를 해제한다.
(2) ft_lstclear : 주어진 연결리스트 전체를 삭제
- 구현 코드 예시 :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
#include "libft.h"
void ft_lstclear(t_list **lst, void (*del)(void *))
{
t_list *tmp;
t_list *lst_ptr;
lst_ptr = (*lst);
while (lst_ptr)
{
tmp = lst_ptr;
lst_ptr = lst_ptr->next;
(del)(tmp->content);
free(tmp);
}
*lst = 0;
}
|
cs |
- 연결리스트의 끝까지 반복문을 도는데, 현재 노드의 주소를 tmp에 저장한다. 그다음 연결리스트 포인터를 다음 노드로 이동시킨다.
- 그 후, tmp 포인터와 del() 함수로 현재 노드의 내용물을 삭제하고 현재 노드의 메모리 또한 해제(free)시킨다.
- 주의사항 : 리스트의 삭제가 끝나면 연결리스트의 원래 시작주소에 0을 넣어주고 종료한다. (이걸 안하면 unit-test에서 틀린다)
(3) ft_lstiter : 연결리스트의 모든 노드에 (매개변수로 받은) 함수를 적용
- 구현 코드 예시 :
1
2
3
4
5
6
7
8
9
10
|
#include "libft.h"
void ft_lstiter(t_list *lst, void (*f)(void *))
{
while (lst)
{
(f)(lst->content);
lst = lst->next;
}
}
|
cs |
- while문을 이용하여, 연결리스트 하나씩 포인터를 이동시켜가며 함수를 적용한다.
(4) ft_lstmap : 기존의 연결리스트에 (매개변수로 받은)함수를 적용한 새로운 연결리스트를 구함
- 구현 코드 예시 :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
#include "libft.h"
t_list *ft_lstmap(t_list *lst, void *(*f)(void *), void (*del)(void *))
{
t_list *new_lst;
t_list *tmp;
new_lst = 0;
tmp = 0;
while (lst)
{
tmp = ft_lstnew((f)(lst->content));
if (!(tmp))
{
ft_lstclear(&new_lst, (del));
return (0);
}
ft_lstadd_back(&new_lst, tmp);
lst = lst->next;
}
lst = 0;
return (new_lst);
}
|
cs |
- 새로운 노드의 할당이 실패하면, ft_lstclear()을 통해 그동안 만들어진 새 연결리스트의 노드들을 모두 해제해준 뒤 0을 리턴한다.
- 성공적으로 새 연결리스트를 생성하는 것을 완료하면, 새 연결리스트의 포인터를 리턴해준다.
- 주의사항 : while문에 들어가기 앞서 new_lst = 0 을 해줘야, ft_lstadd_back()을 통해 첫번째 노드를 생성할 수 있다.
(그 이유는 ft_lstadd_back() 함수 구현 코드를 보면 알 수 있다)
참고) lst 함수 관련 메인함수 예제
: 동료 평가 디팬스에서는 bonus 함수를 활용한 메인함수를 짜라고 요구하는 경우도 간혹 있다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
#include “libft.h”
int main(void)
{
t_list *node;
node = ft_lstnew(ft_strdup("1"));
ft_lstadd_back(&node, ft_lstnew(ft_strdup("2")));
ft_lstadd_back(&node, ft_lstnew(ft_strdup("3")));
while (node)
{
printf("%s\n", (char *)(node->content));
node = node->next;
}
return (0);
}
|
cs |
출력 예시 :
1
2
3
'IT > 42Seoul' 카테고리의 다른 글
Libft 과제 시 유의점 (테스터기, protected, Makefile) (0) | 2021.05.31 |
---|---|
malloc/calloc 관련 정리 (0) | 2021.05.30 |
[Libft] C 언어 라이브러리 구현_BONUS_보너스 함수 구현1 (0) | 2021.05.30 |
Makefile 정리2 (0) | 2021.05.25 |
Makefile 정리1 (0) | 2021.05.25 |