ft_dict_init.c \
ft_dict_insert.c \
ft_dict_traversal.c \
+ ft_linked_list.c \
+ ft_linked_list_helpers.c \
SRCparse:= ft_parse.c \
ft_parsing_table_init.c \
--- /dev/null
+#include "ft_struct.h"
+#include "libft.h"
+#include <stdlib.h>
+
+t_ft_stat ft_linked_list_init(t_linked_list *list, size_t el_size)
+{
+ if (!list)
+ return (invalid_input);
+ list->el_size = el_size;
+ list->head = NULL;
+ return (success);
+}
+
+t_linked_list_node *ft_linked_list_insert(t_linked_list *list, void *element)
+{
+ t_linked_list_node *node;
+ t_linked_list_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 = NULL;
+ node = list->head;
+ if (!node)
+ {
+ list->head = new_node;
+ return (new_node);
+ }
+ while (node->next)
+ node = node->next;
+ node->next = new_node;
+ return (new_node);
+}
+
+void *ft_linked_list_access(t_linked_list_node *node)
+{
+ return (&node->data);
+}
+
+void ft_linked_list_delete(t_linked_list *list,
+ t_linked_list_node *node, t_free_fun free_el)
+{
+ t_linked_list_node *parent;
+
+ if (!list || !list->head || !node)
+ return ;
+ if (node == list->head)
+ {
+ list->head = node->next;
+ if (free_el)
+ free_el(ft_linked_list_access(node));
+ free(node);
+ return ;
+ }
+ parent = list->head;
+ while (parent->next && parent->next != node)
+ parent = parent->next;
+ ft_linked_list_delete_next(parent, free_el);
+ return ;
+}
+
+void ft_linked_list_free(t_linked_list *list, t_free_fun free_el)
+{
+ t_linked_list_node *node;
+ t_linked_list_node *next;
+
+ node = list->head;
+ while (node)
+ {
+ next = node->next;
+ if (free_el)
+ free_el(ft_linked_list_access(node));
+ free(node);
+ node = next;
+ }
+ list->head = NULL;
+ return ;
+}
--- /dev/null
+#include "ft_struct.h"
+#include <stdlib.h>
+
+void ft_linked_list_delete_next(t_linked_list_node *node, t_free_fun free_el)
+{
+ t_linked_list_node *child;
+
+ if (!node || !node->next)
+ return ;
+ child = node->next->next;
+ if (free_el)
+ free_el(ft_linked_list_access(node->next));
+ free(node->next);
+ node->next = child;
+ return ;
+}
+
/* By: ljiriste <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2024/06/20 16:59:43 by ljiriste #+# #+# */
-/* Updated: 2025/09/17 08:36:29 by ljiriste ### ########.fr */
+/* Updated: 2025/12/30 09:43:24 by ljiriste ### ########.fr */
/* */
/* ************************************************************************** */
void *ft_dict_traverse(t_dict_traversal *traversal);
void ft_dict_traversal_free(t_dict_traversal *traversal);
+typedef struct s_linked_list_node t_linked_list_node;
+
+struct s_linked_list_node
+{
+ t_linked_list_node *next;
+ char data[];
+};
+
+typedef struct s_linked_list
+{
+ size_t el_size;
+ t_linked_list_node *head;
+} t_linked_list;
+
+t_ft_stat ft_linked_list_init(t_linked_list *list, size_t el_size);
+// Because of notoriously slow access, the insert function returns a pointer to
+// the inserted node instead of t_ft_stat (so the user needs not traverse).
+// NULL signifies an error (probably failed allocation of memory).
+t_linked_list_node *ft_linked_list_insert(t_linked_list *list, void *element);
+void *ft_linked_list_access(t_linked_list_node *node);
+void ft_linked_list_delete(t_linked_list *list,
+ t_linked_list_node *node, t_free_fun free_el);
+void ft_linked_list_delete_next(
+ t_linked_list_node *node, t_free_fun free_el);
+void ft_linked_list_free(t_linked_list *list, t_free_fun free_el);
+
# ifdef __cplusplus
}
# endif // __cplusplus