Libft Bonus


ft_lstnew


t_list ft_lstnew(void content)
新リストのnext変数(次のノードのポインタ)はNULLに初期化されます.
生成された関数だけです. 追加または挿入された関数ではありません!! そのため、以下のような疑問がありますが、余計な心配です.
  • そもそもNULLを指す最後の要素は何ですか?
  • 二つのリストはNULLではないですか?
  • ノードの作成、追加、挿入には異なる概念があります.
  • 추가新しく作成したノードを接続リストの末尾に貼り付ける
  • 삽입ノードとノードの間に新しいノードを挿入する
  • 下記参照:  https://junistudy.tistory.com/2
  • mallocなしで新しいノードを作成すると、ft newlst関数が終了すると返されるnewノードはスタックから消えます.mallocはhip領域に割り当てられ、関数が終了してもメモリに残ります.  t_list *new  割り当てられたメモリを指すことができます.void ft_lstadd_front(t_list *lst, t_list new)
    #include"libft.h"
    
    t_list	*ft_lstnew(void	*content)
    {
    	t_list	*new;
    
    	new = (t_list *)malloc(sizeof(t_list));
    	if (!new)
    		return (NULL);
    	new->content = content;
    	new->next = NULL;
    	return (new);
    }

    ft_lstadd_front


    リストの一番前に新しいリストを追加する関数
  • 新しいノードの次のアドレスをheadに設定
  • headが新しいノードに設定されている
  • 接続リストを実装するときにダブルポインタを使用する理由
  • 単一接続リストに挿入・削除することでheadポインタの値を変更できます.
  • この場合、呼び出された関数のポインタ変数が参照するオブジェクトを呼び出された関数から置き換える場合は、2ポインタを使用します.
  • t_list **lst  表示 t listポインタ(lst)アドレスへのポインタ.
  • t_list **lst  変数に含まれる値は次のとおりです.  t_list *の住所
  • t_list ** lst  t_list *  のアドレスは、あるリストの最初のアドレス
  • つまり*lstはheadのアドレス
  • #include"libft.h"
    
    void	ft_lstadd_front(t_list	**lst, t_list	*new)
    {
    	if (!lst || !new)
    		return ;
    	new->next = *lst;
    	*lst = new;
    }

    ft_lstsize


    int ft_lstsize(t_list *lst)
    カウントリストに含まれる要素の数.
    #include"libft.h"
    
    int	ft_lstsize(t_list	*lst)
    {
    	int	size;
    
    	size = 0;
    	while (lst)
    	{
    		lst = lst->next;
    		size++;
    	}
    	return (size);
    }

    ft_lstlast


    t_list ft_lstlast(t_list lst)
    リストの最後の要素を返します.
    #include"libft.h"
    
    t_list	*ft_lstlast(t_list	*lst)
    {
    	if (!lst)
    		return (NULL);
    	while (lst->next)
    		lst = lst->next;
    	return (lst);
    }

    ft_lstadd_back


    void ft_lstadd_back(t_list *lst, t_list new)
    要素「new」をリストの末尾に追加します.
  • newの次のアドレスを元のlastの次のアドレス(=NULL)に設定する
  • lastの以下のアドレスをnewに変更
  • ft_lstlast();` lstを関数のパラメータとして*lstを送信すべきかどうかが混同されています.
  • lstlast関数がパラメータ  t_list *  すなわち、最初の要素のアドレスを受信します.
  • そう考えるのは簡単だft_lstadd_back  我々が関数から得たパラメータのデータ型はt list*である. (t_list * ) = t_list したがって、*lstはパラメータとして送信できます.*lst == NULL  第二課  lst == NULL  差異
  • lstはlstの最初のアドレス、すなわち磁気ヘッドのアドレスを示す.頭が空いていて、
  • lstは空リスト そういう意味!
  • lst=NULLはリスト自体が存在しないことを示す!
  • #include"libft.h"
    
    void	ft_lstadd_back(t_list	**lst, t_list	*new)
    {
    	t_list	*last;
    
    	if (!lst || !new)
    		return ;
    	if (!(*lst))
    	{
    		*lst = new;
    		return ;
    	}
    	last = ft_lstlast(*lst);
    	new->next = last->next;
    	last->next = new;
    }

    ft_lstdelone


    void ft_lstdelone(t_list lst, void (del)(void *))
    1番目のパラメータ値として受信した要素の内容を2番目のパラメータとして受信した関数ポインタを使用して、要素自体のメモリを解放します.nextポインタは閉じられません.
    #include"libft.h"
    
    void	ft_lstdelone(t_list	*lst, void	(*del)(void *))
    {
    	if (!lst)
    		return ;
    	del(lst->content);
    	free(lst);
    }

    ft_lstclear


    関数「del」およびfree(3)を使用して、パラメータ値として受信した要素およびその後のリスト内のすべての要素を削除して解放します.最後に、リスト内のポインタをNULLに設定する必要があります.
    #include"libft.h"
    
    void	ft_lstclear(t_list	**lst, void	(*del)(void *))
    {
    	t_list	*next;
    	t_list	*now;
    
    	now = *lst;
    	if (!lst || !del)
    		return ;
    	while (now)
    	{
    		next = now->next;
    		ft_lstdelone(now, del);
    		now = next;
    	}
    	*lst = NULL;
    }

    ft_lstiter


    void ft_lstiter(t_list lst, void (f)(void *))
    リスト「lst」を巡回し、関数「f」をリスト内のすべての要素の内容に繰り返し適用します.
    #include"libft.h"
    
    void	ft_lstiter(t_list	*lst, void	(*f)(void *))
    {
    	if (!lst || !f)
    		return ;
    	while (lst)
    	{
    		f(lst->content);
    		lst = lst->next;
    	}
    }

    ft_lstmap


    t_list ft_lstmap(t_list lst, void (f)(void ), void (del)(void *))
    リスト「lst」の要素を巡り、関数「f」を各要素の内容に連続的に適用します.また、アプリケーション関数「f」の成果物を含む新しいリストも作成されます.del'関数は、必要に応じて各要素の内容を削除するために使用されます.
    #include"libft.h"
    
    t_list	*ft_lstmap(t_list	*lst, void	*(*f)(void *), void	(*del)(void *))
    {
    	t_list	*res;
    	t_list	*tmp;
    
    	if (!f || !lst)
    		return (0);
    	res = 0;
    	while (lst)
    	{
    		tmp = ft_lstnew((f)(lst->content));
    		if (!tmp)
    		{
    			ft_lstclear(&res, del);
    			return (0);
    		}
    		ft_lstadd_back(&res, tmp);
    		tmp = tmp->next;
    		lst = lst->next;
    	}
    	return (res);
    }