Libft Bonus
ft_lstnew
t_list ft_lstnew(void content)
新リストのnext変数(次のノードのポインタ)はNULLに初期化されます.
生成された関数だけです. 追加または挿入された関数ではありません!! そのため、以下のような疑問がありますが、余計な心配です.
추가
新しく作成したノードを接続リストの末尾に貼り付ける삽입
ノードとノードの間に新しいノードを挿入する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
リストの一番前に新しいリストを追加する関数
t_list **lst
表示 t listポインタ(lst)アドレスへのポインタ.t_list **lst
変数に含まれる値は次のとおりです. t_list *
の住所t_list ** lst
t_list *
のアドレスは、あるリストの最初のアドレス#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」をリストの末尾に追加します.
t_list *
すなわち、最初の要素のアドレスを受信します.ft_lstadd_back
我々が関数から得たパラメータのデータ型はt list*である. (t_list * ) = t_list したがって、*lstはパラメータとして送信できます.*lst == NULL
第二課 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);
}
Reference
この問題について(Libft Bonus), 我々は、より多くの情報をここで見つけました https://velog.io/@wldus24/Libft-Bonusテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol