Home > front end >  extract last line in linked list
extract last line in linked list

Time:04-18

My clean_stash(list **stash) function takes a pointer to a linked list
the linked list contains strings of buff size which are extracted from a bigger string str.
for example:

typedef struct node
{
    char *content;
    struct node *next;
} list;
char *str = "atomic\nhabits";
int  buff = 5;

by that the linked list stash will contain:

          ------- ---       -------- ---       ----- ------ 
stash    | atomi | @ |---->| c\nhab | @ |---->| its | NULL |
          ------- ---       -------- ---       ----- ------ 
// let's don't care about the code behind filling the linked list, I tested it and it works fine

the clean_stash function will delete the all the text but the last line
so the result will be:

          ---------- ------ 
stash    | habits\0 | NULL |
          ---------- ------ 

this is my clean_stash function:

void    clean_stash(list **stash)
{
    list    *last;
    list    *clean_node; // from ato\nmic to mic
    int     i;
    int     j;

    clean_node = malloc(sizeof(list));
    if (!stash || !clean_node)
        return ;

    clean_node->next = NULL;
    last = ft_lst_get_last(*stash);
    i=0;
    while (last->content[i] && last->content[i] != '\n')
        i  ;
    if (last->content && last->content[i] == '\n')
        i  ;

    clean_node->content = malloc(sizeof(char) * ((strlen(last->content) - i)   1));
    if (clean_node->content == NULL)
        return ;
    j = 0;
    while (last->content[i])
        clean_node->content[j  ] = last->content[i  ]; 
    clean_node->content[j] = '\0';

    lst_display(clean_node); //this works as expected
    free_stash(*stash);
    *stash = clean_node;
    lst_display(clean_node); //this doesn't work at all
}

I created a clean_node of type list and coppied in it the last line in stash and all of that worked fine. I used lst_display function to display the content of the clean_node and I got my expected output(a node containing the last line)
the problem started when I freed the stash pointer and tried to assigne the clean_node to it. I used a free_stash(*stash) function.

void    free_stash(list *stash)
{
    list    *current;
    list    *next;

    current = stash;
    
    while (current)
    {
        free(current->content);
        next = current->next;
        free(current);
        current = next;
    }
}

and that deleted both my stash and my clean_node. I don't know why it deleted my clean_node.
and that's what confused me for 3 days :)
I thought the problem is in this line clean_node->content[j ] = last->content[i ]; so I changed it with strcpy(clean_node->content, (last->content i)); but that didn't work too
I need help please can anyone explain this to me?
Thanks in advance.
Edit: ft_lst_get_last return a pointer to the last element in the list:

list    *ft_lst_get_last(list *stash)
{
    list    *current;

    current = stash;
    while (current && current->next)
        current = current->next;
    return (current);
}

lst_display just displays a linked list:

int lst_display(list *lst)
{
    int i;

    i = 0;
    printf("/////////// list /////////////\n");
    while (lst)
    {
        printf("%d: %s\n", i, lst->content);
        lst = lst->next;
        i  ;
    }
    printf("///////// end of List //////////\n");
    return (i);
}

CodePudding user response:

for some reason my free_stash function was deleting my clean_node list while I was trying to free the stash list, clean_node and stash are two separate lists they're not related to each other at all. despite of that it get's deleted when I pass stash to the free_stash()
I still need an explanation why that happened
but I solved the problem with changing my free_stash function to

void free_stash(list **stash)
{
    list *current = *stash;
    list *next;

    while (current != NULL)
    {
       next = current->next;
       free(current);
       current = next;
    }
    *stash = NULL;
}
  • Related