연결 리스트란 자료구조의 한 종류로 각각의 데이터들을 보관하고있는 변수들이 자신의 다음 노드를 가르키고 있는 자료구조를 의미한다 배열의경우 데이터가 메모리상에 순차적으로 존재하여 배열 중간에 값을 삽입하고 삭제하는것에 있어서 불편함이 있지만 연결 리스트의 경우 중간에 값을 삽입하거나 삭제하는등의 동작을 할때 연결된노드들의 주소값을 변경주는것으로 쉽게 할 수 있다는 장점이있다 단 특정 데이터를 참조할때 배열의경우 해당 idx번호만 알고있으면 바로 접근이 가능한것과 달리 연결리스트는 head부터 순회하면서 데이터를 확인해야되서 시간이 오래걸린다는 단점이있다 연결리스트의 종류에는 기본 단방향 연결리스트 부터 원형연결리스트 앞으로도 연결되어있지만 뒤로도 연결되있는 이중연결리스트 원형이중연결리스트등 종류가 다양하다 그중에서 이번 Libft Bonus과제에서는 가장 기본적인 단반향 연결리스트에 대해서 구현해본다.
typedef struct s_list
{
void *content;
struct s_list *next;
} t_list;
#include "libft.h"
t_list *ft_lstnew(void *content)
{
t_list *newnode;
newnode = (t_list *)malloc(sizeof(t_list));
if (newnode == 0)
return (0);
newnode->content = content;
newnode->next = (void *)0;
return (newnode);
}
#include "libft.h"
void ft_lstadd_front(t_list **lst, t_list *new)
{
if (*lst == NULL)
{
*lst = new;
new->next = NULL;
return ;
}
new->next = *lst;
*lst = new;
}
#include "libft.h"
void ft_lstadd_back(t_list **lst, t_list *new)
{
t_list *temp;
if (*lst == (void *)0)
*lst = new;
else
{
temp = *lst;
while (temp->next != (void *)0)
temp = temp->next;
temp->next = new;
}
}
#include "libft.h"
int ft_lstsize(t_list *lst)
{
int i;
t_list *temp;
i = 1;
if (lst == NULL)
return (0);
temp = lst;
while (temp->next != (void *)0)
{
temp = temp->next;
i++;
}
return (i);
}
#include "libft.h"
t_list *ft_lstlast(t_list *lst)
{
t_list *temp;
if (lst == (void *)0)
return (lst);
temp = lst;
while (temp->next != (void *)0)
{
temp = temp->next;
}
return (temp);
}
#include "libft.h"
void ft_lstdelone(t_list *lst, void (*del)(void *))
{
del(lst->content);
free (lst);
}
#include "libft.h"
void ft_lstclear(t_list **lst, void (*del)(void *))
{
t_list *temp;
temp = *lst;
if (*lst == (void *)0)
return ;
while (temp != (void *)0)
{
del (temp->content);
*lst = temp->next;
free (temp);
temp = *lst;
}
lst = (void *)0;
}
#include "libft.h"
void ft_lstiter(t_list *lst, void (*f)(void *))
{
t_list *temp;
if (lst == (void *)0)
return ;
temp = lst;
while (temp->next != (void *)0)
{
f(temp->content);
temp = temp->next;
}
f(temp->content);
}
#include "libft.h"
t_list *ft_lstmap(t_list *lst, void *(*f)(void *), void (*del)(void *))
{
int i;
t_list *temp_lst;
t_list *plst;
t_list *plst_head;
i = 0;
temp_lst = lst;
plst_head = 0;
plst = 0;
if (lst == (void *)0)
return (0);
while (temp_lst != (void *)0)
{
plst = ft_lstnew((temp_lst->content));
if (plst == 0)
{
ft_lstclear(&plst_head, del);
return (0);
}
plst->content = f(temp_lst->content);
ft_lstadd_back(&plst_head, plst);
temp_lst = temp_lst->next;
i++;
}
return (plst_head);
}