밥한그릇배따시게
SW 개발자 블로그
밥한그릇배따시게
전체 방문자
오늘
어제
  • 분류 전체보기 (71)
    • Notice (공지) (2)
    • IT (58)
      • 학과 공부 (13)
      • Algorithm (1)
      • 42Seoul (20)
      • 데이터 과학 & 인공지능 (5)
      • go 언어 (3)
      • 블록체인 (2)
      • 왕초보 강의 (5)
      • ETC (4)
    • About Me (5)
      • 회고록 (1)
      • 일상 (4)
    • English (6)
      • 회화 (4)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 왕초보
  • 운영체제
  • c언어
  • GIT
  • 전공공부
  • 영어표현
  • 라이브러리
  • Libft
  • 회화
  • FD
  • vscode
  • KOCW
  • parser
  • 영어
  • 계절학기
  • 스피킹
  • Github
  • 영어공부
  • GNL
  • 42본과정
  • 42seoul
  • 컴퓨터공학
  • cqu
  • get_next_line
  • 컴파일러
  • IT
  • til
  • 오류
  • m1
  • 온라인 어학연수

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
밥한그릇배따시게

SW 개발자 블로그

IT/42Seoul

[Libft] C 언어 라이브러리 구현_BONUS_보너스 함수 구현2

2021. 5. 30. 20:26

혹시나 문제가 된다면 바로 비공개 처리하겠습니다. 지적이나 댓글 환영합니다!

 

이번 포스팅에서는 보너스 파트의 함수를 이어서 구현해보았다. 보너스 파트는 연결리스트(랑크드리스트)를 이용한 기본적인 기능을 구현한 함수들을 구현하였다. 이후에도 많이 사용하게 될 것 같다.

 

참고로, 내가 정의한 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);
}
 
Colored by Color Scripter
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;
}
 
Colored by Color Scripter
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;
    }
}
Colored by Color Scripter
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);
}
Colored by Color Scripter
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);
}
 
Colored by Color Scripter
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
    'IT/42Seoul' 카테고리의 다른 글
    • Libft 과제 시 유의점 (테스터기, protected, Makefile)
    • malloc/calloc 관련 정리
    • [Libft] C 언어 라이브러리 구현_BONUS_보너스 함수 구현1
    • Makefile 정리2
    밥한그릇배따시게
    밥한그릇배따시게
    공부하고 정리한 내용 중, 공유할만한 내용들을 포스팅합니다. / 소프트웨어 학사 (2025년도 2월 졸업)

    티스토리툴바