提取链表中的最后一行
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;
}
我的 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;
}