ft_lstmap - chanhl22/libft GitHub Wiki

  1 /* ************************************************************************** */
  2 /*                                                                            */
  3 /*                                                        :::      ::::::::   */
  4 /*   ft_lstmap.c                                        :+:      :+:    :+:   */
  5 /*                                                    +:+ +:+         +:+     */
  6 /*   By: chanhlee <[email protected].>       +#+  +:+       +#+        */
  7 /*                                                +#+#+#+#+#+   +#+           */
  8 /*   Created: 2021/01/29 15:54:44 by chanhlee          #+#    #+#             */
  9 /*   Updated: 2021/01/31 10:30:32 by chanhlee         ###   ########.fr       */
 10 /*                                                                            */
 11 /* ************************************************************************** */
 12 
 13 #include "libft.h"
 14 
 15 t_list *ft_lstmap(t_list *lst, void *(*f)(void *), void (*del)(void *))
 16 {
 17     t_list *new_list;
 18     t_list *curr;
 19     t_list *temp;
 20 
 21     if (!lst || !f)
 22         return (NULL);
 23     if (!(new_list = ft_lstnew(f(lst->content)))) // 1. lst๋กœ ๋ฐ›์€ ๋งํฌ๋“œ๋ฆฌ์ŠคํŠธ ๊ฐ
 content์— fํ•จ์ˆ˜๋ฅผ ์ ์šฉํ•œ ์ƒˆ๋กœ์šด ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค๊ณ ! -> ์—ฌ๊ธฐ์„œ ํ• ๋‹น ์‹คํŒจํ•˜๋ฉด NULL ๋ฐ˜ํ™˜
 24         return (NULL); 
 25     curr = new_list; //1. ์ƒˆ๋กœ ๋งŒ๋“ค์–ด์ง„ ๋ฆฌ์ŠคํŠธ๋ฅผ curr ๋ณ€์ˆ˜์— ๋‹ด์•„๋‚ธ๋‹ค. 
์™œ? f๋ฅผ ์ ์šฉํ•œ ๋ฆฌ์ŠคํŠธ์˜ ์ฒซ ๋ฒˆ์งธ ์ฃผ์†Œ์˜ ๊ฐ’์„ ์•Œ์•„์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ -> ์‹ค์ œ ์ƒˆ๋กœ์šด๋ฆฌ์ŠคํŠธ์˜ ๊ฐ’์ด
 next์˜ ๊ฐ’์œผ๋กœ ๋ฐ”๋€Œ๋ฉด ์•ˆ๋œ๋‹ค. (new_list์˜ ์‹ค์ œ ๊ฐ’์ด ๋ฐ˜ํ™˜์ด ๋˜์–ด์•ผํ•˜๋Š”๋ฐ ์ด๊ฑฐ๋ฅผ ๊ฑด๋“ค๋ฉด 
์ด์ƒํ•œ ๊ฐ’์ด ๋“ค์–ด๊ฐ)
 26     lst = lst->next; //1. lst = lst->next๋ฅผ ์จ์•ผํ•˜๋Š”๋ฐ 
์™œ ?lst = lst->next ๋ฅผ ์™€์ผ๋ฌธ ์œ„์—์„œ, ์™€์ผ๋ฌธ ์•ˆ์—์„œ ๋‘ ๋ฒˆ ์“ด ์ด์œ  
->lst->next๊ฐ€ NULL์ด์—ˆ์„ ๊ฒฝ์šฐ ์™€์ผ๋ฌธ ์ง„์ž… ๋ชปํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด์„œ.
NULL ์ธ๋ฐ ์™€์ผ๋ฌธ ์ง„์ž…ํ–ˆ์„ ๊ฒฝ์šฐ -> return NULL;  
NULL ์ด์—ฌ์„œ ์™€์ผ๋ฌธ ์ง„์ž… ์•ˆ ํ–ˆ์„ ๊ฒฝ์šฐ -> return (new_head) (ํ—ค๋“œ๋งŒ ์žˆ๋Š” ์—ฐ๊ฒฐ ๋ฆฌ์ŠคํŠธ)  
ํ—ค๋“œ๋งŒ ์žˆ์„ ๋•Œ ๋ฐ˜ํ™˜๊ฐ’์ด ๋‹ฌ๋ผ์ง„๋‹ค!!!!  
 27     while (lst)
 28     {
 29         if (!(temp = ft_lstnew(f(lst->content))))  //1. ๊ทธ๋ฆฌ๊ณ  ๋ฐ›์€ ๋ฆฌ์ŠคํŠธ์—์„œ next
๊ฐ’์„ ๋˜ f๋กœ ๋ฐ”๊ฟ”์„œ ์–ด๋–ค ๋ณ€์ˆ˜(temp)์— ๋„ฃ์–ด์ค€๋‹ค. (์ƒˆ๋กœ ๋˜ ๋ณ€์ˆ˜๋ฅผ ๋งŒ๋“ค์–ด์ค˜์„œ curr->next์— 
ํ•ฉ์น˜๊ธฐ ์œ„ํ•จ)
 30         {
 31             ft_lstclear(&newlst, del); //๋ฌธ์ œ๊ฐ€ ์ƒ๊ฒผ์„๋•Œ ์‚ญ์ œ
 32             return (NULL);
 33         }
 34         curr->next = temp; // ๊ทธ๋ฆฌ๊ณ  ์ƒˆ๋กœ๋งŒ๋“  temp๋ฅผ curr์— ์—ฐ๊ฒฐํ•ด์ค€๋‹ค.
 35         curr = temp; //์—ฐ๊ฒฐํ•ด์ฃผ๊ณ  curr์˜ ์ฃผ์†Œ๊ฐ’์„ ๋ฐ”๊ฟ”์ค€๋‹ค. ๋‹ค์Œ ๋…ธ๋“œ์—์„œ ์—ฐ๊ฒฐ๋˜๊ฒŒ
 ํ•˜๊ธฐ ์œ„ํ•จ
 36         lst = lst->next;  //๊ทธ๋ฆฌ๊ณ  ๋˜ ๊ฐ€์ ธ์˜ค๋Š” lst์—์„œ lst->next๋กœ ๋‹ค์Œ ๋…ธ๋“œ์˜ ์ฃผ์†Œ๋ฅผ
 ์ €์žฅํ•œ๋‹ค. (๋‹ค์Œ ๋…ธ๋“œ์— f๋ฅผ ์ ์šฉํ•˜๊ธฐ ์œ„ํ•จ)
 37     }
 38     return (new_list);                                                                   
 39 }