提取链表中的最后一行

extract last line in linked list

我的 clean_stash(list **stash) 函数接受一个指向链表的指针
链接列表包含 buff 大小的字符串,这些字符串是从更大的字符串 str.
中提取的 例如:

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

链表 stash 将包含:

         +-------+---+     +--------+---+     +-----+------+
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

clean_stash 函数将删除除最后一行之外的所有文本
所以结果将是:

         +----------+------+
stash    | habits[=12=] | NULL |
         +----------+------+

这是我的 clean_stash 功能:

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] = '[=13=]';

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

我创建了一个 clean_node 类型的 list 并在其中复制了 stash 中的最后一行,所有这些都工作正常。我使用 lst_display 函数来显示 clean_node 的内容,我得到了预期的输出(包含最后一行的节点)
当我释放 stash 指针并尝试将 clean_node 分配给它时,问题就开始了。我使用了 free_stash(*stash) 函数。

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

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

并且删除了我的藏品和我的 clean_node。我不知道为什么它删除了我的 clean_node.
这就是让我困惑了 3 天的原因:)
我认为问题出在这一行 clean_node->content[j++] = last->content[i++]; 所以我用 strcpy(clean_node->content, (last->content+i)); 更改了它,但这也不起作用
我需要帮助,谁能给我解释一下吗?
提前致谢。
编辑: ft_lst_get_last return 指向列表中最后一个元素的指针:

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

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

lst_display只是显示一个链表:

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);
}

出于某种原因,我的 free_stash 函数正在删除我的 clean_node 列表,而我正试图释放 stash 列表,clean_node 和 stash 是两个单独的列表彼此根本没有关系。尽管如此,当我将 stash 传递给 free_stash()
时,它还是被删除了 我仍然需要解释为什么会这样
但我通过将 free_stash 函数更改为

解决了这个问题
void free_stash(list **stash)
{
    list *current = *stash;
    list *next;

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