]> www.ljiriste.work Git - Libft.git/commitdiff
Optimize node insertion into linked list
authorLukáš Jiřiště <redacted>
Mon, 6 Apr 2026 10:56:31 +0000 (12:56 +0200)
committerLukáš Jiřiště <redacted>
Mon, 6 Apr 2026 10:56:31 +0000 (12:56 +0200)
Linked list now holds a pointer to its last element so there is no need
for iterating through the whole list for appending.
Insertion into list was also moved to a new file.

Makefile
ft_struct/ft_llist.c
ft_struct/ft_llist_insert.c [new file with mode: 0644]
inc/ft_struct.h

index 8308ace7cc76dbcc6e0e5d070047705cb28af794..1f8b8a25de265e825912d18f73f12d1f21dbe3f2 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -48,6 +48,7 @@ SRCstruct:=   ft_stack_free.c                                                                                 \
                        ft_dict_insert.c                                                                                \
                        ft_dict_traversal.c                                                                             \
                        ft_llist.c                                                                                              \
+                       ft_llist_insert.c                                                                               \
                        ft_llist_delete.c                                                                               \
                        ft_graph.c                                                                                              \
                        ft_graph_helpers.c                                                                              \
index b41f5e44b5f66616ac09b45d3f64267f607fffbc..b7e33b20411dc9cc52628d64cf9e5f46d8e01bbc 100644 (file)
@@ -11,45 +11,6 @@ t_ft_stat    ft_llist_init(t_llist *list, size_t     el_size)
        return (success);
 }
 
-t_llist_node           *ft_llist_insert(t_llist *list, void *element)
-{
-       t_llist_node    *node;
-       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 = 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);
-}
-
-t_llist_node           *ft_llist_insert_head(t_llist *list, void *element)
-{
-       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_access(t_llist_node *node)
 {
        return (&node->data);
diff --git a/ft_struct/ft_llist_insert.c b/ft_struct/ft_llist_insert.c
new file mode 100644 (file)
index 0000000..913d782
--- /dev/null
@@ -0,0 +1,42 @@
+#include "ft_struct.h"
+#include "libft.h"
+#include <stdlib.h>
+
+t_llist_node           *ft_llist_insert(t_llist *list, void *element)
+{
+       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 = NULL;
+       if (list->tail)
+       {
+               list->tail->next = new_node;
+               list->tail = new_node;
+       }
+       else
+       {
+               list->head = new_node;
+               list->tail = new_node;
+       }
+       return (new_node);
+}
+
+t_llist_node           *ft_llist_insert_head(t_llist *list, void *element)
+{
+       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);
+}
index ff2dccf37d90bda1823a11af3dce725d4c7a2906..3d5dcb54ecd56eb3264cd4aba58f666f3945e9d9 100644 (file)
@@ -32,6 +32,7 @@ typedef struct s_linked_list
 {
        size_t                  el_size;
        t_llist_node    *head;
+       t_llist_node    *tail;
 }                                      t_llist;
 
 t_ft_stat                      ft_llist_init(t_llist *list, size_t el_size);