ft_dict_insert.c \
ft_dict_traversal.c \
ft_llist.c \
- ft_llist_helpers.c \
+ ft_llist_delete.c \
ft_graph.c \
ft_graph_helpers.c \
return (new_node);
}
-void *ft_llist_access(t_llist_node *node)
+t_llist_node *ft_llist_insert_head(t_llist *list, void *element)
{
- return (&node->data);
+ t_llist_node *new_node;
+
+ if (!list || !element)
+ return (NULL);
+ new_node = malloc(sizeof(*new_node) + list->el_size);
+ if (!new_node)
+ return (NULL);
+ ft_memcpy(&new_node->data, element, list->el_size);
+ new_node->next = list->head;
+ list->head = new_node;
+ return (new_node);
}
-void ft_llist_delete(t_llist *list,
- t_llist_node *node, t_free_fun free_el)
+void *ft_llist_access(t_llist_node *node)
{
- t_llist_node *parent;
-
- if (!list || !list->head || !node)
- return ;
- if (node == list->head)
- {
- list->head = node->next;
- if (free_el)
- free_el(ft_llist_access(node));
- free(node);
- return ;
- }
- parent = list->head;
- while (parent->next && parent->next != node)
- parent = parent->next;
- ft_llist_delete_next(parent, free_el);
- return ;
+ return (&node->data);
}
void ft_llist_free(t_llist *list, t_free_fun free_el)
--- /dev/null
+#include "ft_struct.h"
+#include <stdlib.h>
+
+void ft_llist_delete_next(t_llist_node *node, t_free_fun free_el)
+{
+ t_llist_node *child;
+
+ if (!node || !node->next)
+ return ;
+ child = node->next->next;
+ if (free_el)
+ free_el(ft_llist_access(node->next));
+ free(node->next);
+ node->next = child;
+ return ;
+}
+
+void ft_llist_delete(t_llist *list,
+ t_llist_node *node, t_free_fun free_el)
+{
+ t_llist_node *parent;
+
+ if (!list || !list->head || !node)
+ return ;
+ if (node == list->head)
+ {
+ list->head = node->next;
+ if (free_el)
+ free_el(ft_llist_access(node));
+ free(node);
+ return ;
+ }
+ parent = list->head;
+ while (parent->next && parent->next != node)
+ parent = parent->next;
+ ft_llist_delete_next(parent, free_el);
+ return ;
+}
+
+void ft_llist_delete_head(t_llist *list, t_free_fun free_el)
+{
+ t_llist_node *deleted_node;
+
+ if (!list || !list->head)
+ return ;
+ deleted_node = list->head;
+ list->head = deleted_node->next;
+ if (free_el)
+ free_el(ft_llist_access(deleted_node));
+ free(deleted_node);
+ return ;
+}
+++ /dev/null
-#include "ft_struct.h"
-#include <stdlib.h>
-
-void ft_llist_delete_next(t_llist_node *node, t_free_fun free_el)
-{
- t_llist_node *child;
-
- if (!node || !node->next)
- return ;
- child = node->next->next;
- if (free_el)
- free_el(ft_llist_access(node->next));
- free(node->next);
- node->next = child;
- return ;
-}
-
// the inserted node instead of t_ft_stat (so the user needs not traverse).
// NULL signifies an error (probably failed allocation of memory).
t_llist_node *ft_llist_insert(t_llist *list, void *element);
+t_llist_node *ft_llist_insert_head(t_llist *list, void *element);
void *ft_llist_access(t_llist_node *node);
void ft_llist_delete(t_llist *list,
t_llist_node *node, t_free_fun free_el);
void ft_llist_delete_next(
t_llist_node *node, t_free_fun free_el);
+void ft_llist_delete_head(t_llist *list, t_free_fun free_el);
void ft_llist_free(t_llist *list, t_free_fun free_el);
typedef struct s_graph_node