[Libft] Bonus, Makefile

최별 Choi Byeol·2022년 5월 12일
0

나만의 C 라이브러리를 만들어보는 과제 - Bonus, Makefile 부분

35. ft_lstnew

#include "libft.h"

t_list  *ft_lstnew(void *content)
{
    t_list  *new;

		new = (t_list *)malloc(sizeof(t_list));
    if (new == NULL)
			return (NULL);
    new->content = content;
    new->next = NULL;
    return (new);
}
  • 새로운 t_list 구조체를 생성하고 content를 전달한 뒤 저장하고 반환하는 함수
  • 매개변수
    • content : 생성한 t_list에 저장할 정보
  • 반환 값
    • t_list *형 반환
  • t_list는 libft.h에 정의했으며 content에는 필요한 데이터, next는 현재 노드의 다음 노드주소가 들어간다
typedef struct s_list
{
			void			*content;
			struct s_list	*next;
}				t_list;

36. ft_lstadd_front

#include "libft.h"

void    ft_lstadd_front(t_list **lst, t_list *new)
{
    new -> next = *lst;
    *lst = new;
}
  • 연결 리스트의 맨 앞에 새로운 t_list를 연결하는 함수
  • 매개변수
    • lst : 맨 앞에 새로운 노드를 연결해줄 연결리스트
      new : 새로 넣어줄 t_list노드
  • 리턴 값 X
  • 주의사항
    • 새로운 노드의 next를 현재 연결 리스트의 맨 앞 노드로 설정해준 뒤 새로운 노드를 연결 리스트의 맨 앞으로 설정해야 함.

37. ft_lstsize

#include "libft.h"

int ft_lstsize(t_list *lst)
{
    int     i;
    t_list  *temp;

		i = 0;
    temp = lst;
    while (temp != NULL)
    {
			temp = temp -> next;
			i++;
    }
    return (i);
}
  • 연결 리스트에 있는 총 노드의 수(연결 리스트의 길이)를 반환해주는 함수
  • 매개변수
    • t_list *lst 길이를 구할 연결 리스트
  • 반환 값
    • 연결 리스트에 있는 총 노드의 수(연결 리스트의 길이) 반환

38. ft_lstlast

#include "libft.h"

t_list  *ft_lstlast(t_list *lst)
{
    if (lst == NULL)
			return (NULL);
    while (lst -> next != NULL)
			lst = lst -> next;
    return (lst);
}
  • 연결 리스트의 마지막 노드의 포인터를 반환하는 함수
  • 매개변수
    • t_list *lst 마지막 노드를 반환할 연결 리스트
  • 반환 값
    • 연결 리스트의 마지막 노드의 포인터를 반환
  • 주의사항
    • lst가 NULL이라면 현재 노드가 비어있으므로 다음 노드가 없기 때문에 현재 노드를 바로 반환
    • next가 NULL이라면 다음 노드가 없기 때문에 현재 노드가 마지막 노드

39. ft_lstadd_back

#include "libft.h"

void    ft_lstadd_back(t_list **lst, t_list *new)
{
    t_list  *last;

		if (lst == NULL || new == NULL)
			return ;
    if (*lst == NULL)
    {
			*lst = new;
			return ;
    }
    last = ft_lstlast(*lst);
    new -> next = last -> next;
    last -> next = new;
}
  • 연결 리스트의 끝에 새로운 t_list를 추가하는 함수
  • 매개변수
    • t_list lst** 끝에 새로운 t_list를 추가할 연결리스트
    • t_list new 연결리스트의 끝에 연결할 새로운 노드
  • 반환 값 X
  • 주의사항
    • lst가 NULL이라면 비어있는 연결 리스트이기 때문에 첫 노드가 마지막 노드이므로 새 노드를 추가
    • 반복문을 사용해 마지막 노드에 도달했을 때 현재 노드의 next를 새 노드로 연결시키면 됨

40. ft_lstdelone

#include "libft.h"

void    ft_lstdelone(t_list *lst, void (*del)(void*))
{
    if (lst == NULL || del == NULL)
			return ;
    del(lst -> content);
    free(lst);
}
  • 하나의 노드 내부의 Content를 삭제하고 free하는 함수. 단, next의 데이터는 삭제 X
  • 매개변수
    • t_list *lst 하나의 노드를 삭제할 연결 리스트
    • del 데이터를 삭제할 때 사용할 함수 포인터
  • 반환 값 X
  • 주의사항
    • 현재 노드의 content를 del함수를 사용해 제거해주고 free. 단 next의 메모리는 건들면 X

41. ft_lstclear

#include "libft.h"

void    ft_lstclear(t_list **lst, void (*del)(void*))
{
    t_list  *curr;
    t_list  *next;

		curr = *lst;
    while (curr)
    {
			next = curr -> next;
			ft_lstdelone(curr, del);
			curr = next;
    }
    *lst = NULL;
}
  • 연결 리스트의 데이터를 없에고 free하는 함수
  • 매개변수
    • t_list lst** 없에줄 연결리스트
    • del 데이터를 삭제해줄 함수 포인터
  • 반환 값 X
  • 주의사항
    • lst == NULL은 연결 리스트 자체가 없는 것, *lst == NULL은 연결 리스트에 노드가 없이 비었다는 뜻
    • 연결 리스트를 모두 free 해주고 난 뒤에 초기화하지 않으면 없어진 저장 공간을 가리키고 있는 포인터가 쓰레기 값 때문에 오류를 발생시킬 수 있다(댕글링 포인터)

42. ft_lstiter

#include "libft.h"

void    ft_lstiter(t_list *lst, void (*f)(void *))
{
    if (lst == NULL || f == NULL)
			return ;
    while (lst)
    {
			f(lst -> content);
			lst = lst -> next;
    }
}
  • 연결 리스트 전체를 순회하며 함수 포인터로 받아온 함수 f를 적용시키는 함수
  • 매개변수
    • t_list *lst 순회할 연결리스트의 head
    • f content에 적용시킬 함수의 포인터
  • 반환 값 X
  • 주의사항
    • 연결 리스트를 순회하며 함수 포인터 f로 받아온 함수 f를 content에 적용시켜줌
    • lst->next를 건들지 않고 따로 t_list 포인터를 이용해 순회해야 함.

43. ft_lstmap

#include "libft.h"

t_list  *ft_lstmap(t_list *lst, void *(*f)(void *), void (*del)(void *))
{
    t_list  *result;
    t_list  *tmp;

		if (lst == NULL || f == NULL)
			return (NULL);
    result = NULL;
    while (lst)
    {
			tmp = ft_lstnew((*f)(lst -> content));
			if (tmp == NULL)
			{
				ft_lstclear(&result, del);
				return (NULL);
			}
			ft_lstadd_back(&result, tmp);
			tmp = tmp -> next;
			lst = lst -> next;
    }
    return (result);
}
  • 연결 리스트 각 노드의 content에 f 함수를 적용시켜 새 연결 리스트를 생성하고 반환하는 함수
  • 매개변수
    • t_list *lst f를 적용시켜 새 연결 리스트를 만들 원본 연결 리스트의 head
    • f content에 적용시킬 함수의 포인터
    • del 삭제가 필요할 때 사용할 함수의 포인터
  • 반환 값
    • t_list *형 반환

Makefile

NAME = libft.a # 최종적으로 만들어질 라이브러리 이름
CC = gcc # 컴파일 명령어
CFLAGS = -Wall -Wextra -Werror # 컴파일 플래그

SRCS = \
      ft_isalpha.c \
      ft_isdigit.c \
      ft_isalnum.c \
      ft_isascii.c \
      ft_isprint.c \
      ft_strlen.c \
      ft_memset.c \
      ft_bzero.c \
      ft_memcpy.c \
      ft_memmove.c \
      ft_strlcpy.c \
      ft_strlcat.c \
      ft_toupper.c \
      ft_tolower.c \
      ft_strchr.c \
      ft_strrchr.c \
      ft_strncmp.c \
      ft_memchr.c \
      ft_memcmp.c \
      ft_strnstr.c \
      ft_atoi.c \
			ft_calloc.c \
      ft_strdup.c \
      ft_substr.c \
      ft_strjoin.c \
      ft_strtrim.c \
      ft_split.c \
      ft_itoa.c \
      ft_strmapi.c \
      ft_striteri.c \
      ft_putchar_fd.c \
      ft_putstr_fd.c \
      ft_putendl_fd.c \
      ft_putnbr_fd.c

SRCS_BONUS = ft_lstnew.c \
             ft_lstadd_front.c \
             ft_lstsize.c \
             ft_lstlast.c \
             ft_lstadd_back.c \
             ft_lstdelone.c \
             ft_lstclear.c \
             ft_lstiter.c \
             ft_lstmap.c

OBJS = $(SRCS:.c=.o) # srcs에 있는 .c를 모두 .o로 바꿔서 불러온다는 의미

OBJS_BONUS = $(SRCS_BONUS:.c=.o)

all: $(NAME)

$(NAME): $(OBJS)

bonus: $(OBJS) $(OBJS_BONUS)

%.o: %.c
    $(CC) $(CFLAGS) -c -o $@ $^
    ar crsu $(NAME) $@ 
# ar은 파일을 모아 라이브러리로 압축하는 명령어, crsu는 ar 옵션

clean:
    rm -f $(OBJS) $(OBJS_BONUS)

fclean: clean
    rm -f $(NAME)

re: clean all

.PHONY: all bonus clean fclean re
# 여기에 명시된 이름은 파일이 아닌 명령어로 보게 함. 이름이 같은 파일과 충돌 방지

Makefile이란?

make = 파일 관리 유틸리티

파일 간의 종속 관계를 파악하여 Makefile(기술 파일)에 적힌 대로 컴파일러에 명령하여 SHELL 명령이 순차적으로 실행될 수 있게 한다.

make 사용의 장점

  • 각 파일에 대한 반복적 명령의 자동화로 인한 시간 절약.
  • 프로그램의 종속 구조를 빠르게 파악할 수 있으며 관리가 용이.
  • 단순 반복 작업 및 재작성을 최소화.

Makefile 실행

  • make ‘옵션’
profile
FE 👩🏻‍💻

0개의 댓글