Revert back to using separate tree and node
authorLukáš Jiřiště <gymnazium.jiriste@gmail.com>
Thu, 31 Jul 2025 12:12:53 +0000 (14:12 +0200)
committerLukáš Jiřiště <gymnazium.jiriste@gmail.com>
Thu, 31 Jul 2025 12:12:53 +0000 (14:12 +0200)
Because the node uses flexible array member it should not be
instantiated on stack. Hence a separate type for t_tree is needed so
that user may use tree on stack (as it is convenient).

Makefile
ft_struct/ft_tree_access_root.c [new file with mode: 0644]
ft_struct/ft_tree_free.c
ft_struct/ft_tree_init.c
inc/ft_struct.h

index e2964d529f92b57d5fb6013d477b49777da7d964..e900d0adb944fec01c111e1b1e5118eb84aa4a7f 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -22,6 +22,7 @@ SRCstruct:=   ft_stack_free.c                                                                                 \
                        ft_stack_push.c                                                                                 \
                        ft_stack_top.c                                                                                  \
                        ft_tree_init.c                                                                                  \
+                       ft_tree_access_root.c                                                                   \
                        ft_tree_append_child.c                                                                  \
                        ft_tree_access_child.c                                                                  \
                        ft_tree_access_data.c                                                                   \
diff --git a/ft_struct/ft_tree_access_root.c b/ft_struct/ft_tree_access_root.c
new file mode 100644 (file)
index 0000000..e3c701a
--- /dev/null
@@ -0,0 +1,8 @@
+#include "ft_struct.h"
+
+t_tree_node    *ft_tree_access_root(t_tree *tree)
+{
+       if (!tree)
+               return (NULL);
+       return (*tree);
+}
index 2de8e2ba94bdd986d1f82abc3b4b8f2be5ba1d6d..b80dff48a9b3f9ef94498ed7202b3685db358307 100644 (file)
@@ -1,14 +1,20 @@
 #include "ft_struct.h"
 #include "libft.h"
+#include <stdlib.h>
 
 void   ft_tree_free(t_tree *tree, void (*free_el)(void *))
 {
-       if (!tree)
+       t_tree_node     *root;
+
+       if (!tree || !*tree)
                return ;
-       while (tree->children.size > 0)
-               ft_tree_erase_subtree(tree, 0, free_el);
+       root = ft_tree_access_root(tree);
+       while (root->children.size > 0)
+               ft_tree_erase_subtree(root, 0, free_el);
        if (free_el)
-               free_el(&tree->data);
-       ft_vec_free(&tree->children, NULL);
+               free_el(&root->data);
+       ft_vec_free(&root->children, NULL);
+       free(root);
+       *tree = NULL;
        return ;
 }
index 60b09b60fb8c0469d784b2bd1de67145816e82cd..b83fae8ef4b813e3ae356f4160f81e236ec640e5 100644 (file)
@@ -2,11 +2,17 @@
 #include "libft.h"
 #include <stdlib.h>
 
-t_ft_stat      ft_tree_init(t_tree *tree, size_t el_size)
+t_ft_stat      ft_tree_init(t_tree *tree, void *root_element, size_t el_size)
 {
-       if (!tree || el_size == 0)
+       t_tree_node     *root;
+
+       if (!tree || !root_element || el_size == 0)
                return (invalid_input);
-       tree->parent = NULL;
-       ft_bzero(&tree->data, el_size);
-       return (ft_vec_init(&tree->children, sizeof(t_tree_node) + el_size));
+       root = malloc(sizeof(t_tree_node) + el_size);
+       if (!root)
+               return (alloc_fail);
+       *tree = root;
+       root->parent = NULL;
+       ft_memcpy(&root->data, root_element, el_size);
+       return (ft_vec_init(&root->children, sizeof(t_tree_node) + el_size));
 }
index 23ff7a325efcfb6f46f874db9286a6aebaabcf92..bcebe0bc6d387070f7b49f3227d77c03760cdd92 100644 (file)
@@ -6,7 +6,7 @@
 /*   By: ljiriste <marvin@42.fr>                    +#+  +:+       +#+        */
 /*                                                +#+#+#+#+#+   +#+           */
 /*   Created: 2024/06/20 16:59:43 by ljiriste          #+#    #+#             */
-/*   Updated: 2025/07/31 13:25:53 by ljiriste         ###   ########.fr       */
+/*   Updated: 2025/07/31 14:07:12 by ljiriste         ###   ########.fr       */
 /*                                                                            */
 /* ************************************************************************** */
 
@@ -47,9 +47,10 @@ struct s_tree_node
        char            data[];
 };
 
-typedef t_tree_node    t_tree;
+typedef t_tree_node *t_tree;
 
-t_ft_stat      ft_tree_init(t_tree *tree, size_t el_size);
+t_ft_stat      ft_tree_init(t_tree *tree, void *root_element, size_t el_size);
+t_tree_node    *ft_tree_access_root(t_tree *tree);
 t_ft_stat      ft_tree_append_child(t_tree_node *tree_node, void *element);
 t_tree_node    *ft_tree_access_child(t_tree_node *tree_node, size_t i);
 void           *ft_tree_access_data(t_tree_node *tree_node);