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

2021. 5. 30. 20:26·IT/42Seoul
목차
  1. (1) ft_lstdelone : 주어진 노드를 삭제
  2. (2) ft_lstclear : 주어진 연결리스트 전체를 삭제
  3. (3) ft_lstiter : 연결리스트의 모든 노드에 (매개변수로 받은) 함수를 적용
  4. (4) ft_lstmap : 기존의 연결리스트에 (매개변수로 받은)함수를 적용한 새로운 연결리스트를 구함
  5. 참고)  lst 함수 관련 메인함수 예제

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

 

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

 

참고로, 내가 정의한 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
  1. (1) ft_lstdelone : 주어진 노드를 삭제
  2. (2) ft_lstclear : 주어진 연결리스트 전체를 삭제
  3. (3) ft_lstiter : 연결리스트의 모든 노드에 (매개변수로 받은) 함수를 적용
  4. (4) ft_lstmap : 기존의 연결리스트에 (매개변수로 받은)함수를 적용한 새로운 연결리스트를 구함
  5. 참고)  lst 함수 관련 메인함수 예제
'IT/42Seoul' 카테고리의 다른 글
  • Libft 과제 시 유의점 (테스터기, protected, Makefile)
  • malloc/calloc 관련 정리
  • [Libft] C 언어 라이브러리 구현_BONUS_보너스 함수 구현1
  • Makefile 정리2
남서아 (구 - 밥한그릇배따시게)
남서아 (구 - 밥한그릇배따시게)
학습하고 정리한 내용 중, 공유할만한 것들을 포스팅합니다. / 소프트웨어 학사 (2025년도 2월 졸업)
  • 남서아 (구 - 밥한그릇배따시게)
    Wendy 기술블로그
    남서아 (구 - 밥한그릇배따시게)
  • 전체
    오늘
    어제
  • 🌐 LANGUAGE
  • 공지사항

    • 개발자 정보 및 포트폴리오
    • 포스팅 목적
  • 링크

    • Portfolio
    • 분류 전체보기 (99)
      • IT (59)
        • 클라우드 & 인프라 (2)
        • CS 공부 (12)
        • 42Seoul (19)
        • 개발 언어 및 도구 (4)
        • 개발 환경 및 설치 (5)
        • 튜토리얼 및 가이드 (10)
        • Data & AI (5)
        • ETC (2)
      • Experience (4)
      • English (32)
        • 회화 (5)
        • 자격증 공부 (26)
        • 후기 (1)
      • 근황 (4)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 인기 글

  • hELLO· Designed By정상우.v4.10.3
남서아 (구 - 밥한그릇배따시게)
[Libft] C 언어 라이브러리 구현_BONUS_보너스 함수 구현2

개인정보

  • 티스토리 홈
  • 포럼
  • 로그인
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.