From: Lukáš Jiřiště Date: Mon, 6 Apr 2026 10:18:01 +0000 (+0200) Subject: Rewrite the stack to use linked list X-Git-Url: https://git.ljiriste.work/?a=commitdiff_plain;h=a979622ee9092aee2e435ffdf91ceb1d28c93a31;p=Libft.git Rewrite the stack to use linked list --- diff --git a/ft_struct/ft_stack_free.c b/ft_struct/ft_stack_free.c index 66148f5..d057d6b 100644 --- a/ft_struct/ft_stack_free.c +++ b/ft_struct/ft_stack_free.c @@ -15,6 +15,6 @@ void ft_stack_free(t_stack *stack, void (*free_el)(void *)) { - ft_vec_free(&stack->vec, free_el); + ft_llist_free(&stack->list, free_el); return ; } diff --git a/ft_struct/ft_stack_init.c b/ft_struct/ft_stack_init.c index 6e8e0d5..3f7feac 100644 --- a/ft_struct/ft_stack_init.c +++ b/ft_struct/ft_stack_init.c @@ -16,5 +16,5 @@ t_ft_stat ft_stack_init(t_stack *stack, size_t el_size) { - return (ft_vec_init(&stack->vec, el_size)); + return (ft_llist_init(&stack->list, el_size)); } diff --git a/ft_struct/ft_stack_pop.c b/ft_struct/ft_stack_pop.c index 1fd7db6..0f2ce9f 100644 --- a/ft_struct/ft_stack_pop.c +++ b/ft_struct/ft_stack_pop.c @@ -18,7 +18,6 @@ void *ft_stack_pop(t_stack *stack, void (*free_el)(void *)) void *res; res = ft_stack_top(stack); - if (res) - ft_vec_erase(&stack->vec, stack->vec.size - 1, free_el); + ft_llist_delete_head(&stack->list, free_el); return (res); } diff --git a/ft_struct/ft_stack_pop_forget.c b/ft_struct/ft_stack_pop_forget.c index b0b0095..3d51c67 100644 --- a/ft_struct/ft_stack_pop_forget.c +++ b/ft_struct/ft_stack_pop_forget.c @@ -15,10 +15,5 @@ void *ft_stack_pop_forget(t_stack *stack) { - void *res; - - res = ft_stack_top(stack); - if (res) - ft_vec_forget(&stack->vec, stack->vec.size - 1); - return (res); + return (ft_stack_pop(stack, NULL)); } diff --git a/ft_struct/ft_stack_push.c b/ft_struct/ft_stack_push.c index 9ad3319..db72c04 100644 --- a/ft_struct/ft_stack_push.c +++ b/ft_struct/ft_stack_push.c @@ -15,5 +15,16 @@ t_ft_stat ft_stack_push(t_stack *stack, void *element) { - return (ft_vec_append(&stack->vec, element)); + t_llist_node *new_node; + + if (!stack || !element) + { + return (invalid_input); + } + new_node = ft_llist_insert_head(&stack->list, element); + if (!new_node) + { + return (alloc_fail); + } + return (success); } diff --git a/ft_struct/ft_stack_top.c b/ft_struct/ft_stack_top.c index 36dd701..be7a55a 100644 --- a/ft_struct/ft_stack_top.c +++ b/ft_struct/ft_stack_top.c @@ -16,7 +16,7 @@ void *ft_stack_top(t_stack *stack) { - if (stack->vec.size == 0) + if (!stack->list.head) return (NULL); - return (ft_vec_access(&stack->vec, stack->vec.size - 1)); + return (ft_llist_access(stack->list.head)); } diff --git a/inc/ft_struct.h b/inc/ft_struct.h index b0f3fba..ff2dccf 100644 --- a/inc/ft_struct.h +++ b/inc/ft_struct.h @@ -20,9 +20,37 @@ extern "C" { # include "ft_arr.h" # include +typedef struct s_linked_list_node t_llist_node; + +struct s_linked_list_node +{ + t_llist_node *next; + char data[]; +}; + +typedef struct s_linked_list +{ + size_t el_size; + t_llist_node *head; +} t_llist; + +t_ft_stat ft_llist_init(t_llist *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_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_stack { - t_vec vec; + t_llist list; } t_stack; t_ft_stat ft_stack_init(t_stack *stack, size_t el_size); @@ -148,34 +176,6 @@ t_dict_entry ft_dict_traverse_full(t_dict_traversal *traversal); void *ft_dict_traverse(t_dict_traversal *traversal); void ft_dict_traversal_free(t_dict_traversal *traversal); -typedef struct s_linked_list_node t_llist_node; - -struct s_linked_list_node -{ - t_llist_node *next; - char data[]; -}; - -typedef struct s_linked_list -{ - size_t el_size; - t_llist_node *head; -} t_llist; - -t_ft_stat ft_llist_init(t_llist *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_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 { t_vec connected_nodes;