迭代列表 lst 并将函数 f 应用于每个 link 以创建“新”列表
Iterates a list lst and applies the function f to each link to create a “fresh” list
我有以下结构:
typedef struct s_list
{
void *content;
void content_size;
struct s_list *next;
} t_list;
我正在尝试创建一个函数:
t_list *lstmap(t_list *lst, t_list *(*f)(t_list *elem));
遍历 t_list 'lst' 的每个元素,应用函数 ' f' 到每个元素和 returns 一个新的 t_list 和新元素。
起初,我尝试了以下方法:
tmp = f(lst);
first = tmp;
while(lst)
{
tmp = f(lst);
tmp = tmp->next;
lst = lst->next;
}
没用。
然后,当这样迭代时:
tmp = f(lst);
first = tmp;
while (lst->next)
{
tmp->next = f(lst->next);
tmp = tmp->next;
lst = lst->next;
}
成功了。
为什么结果不同?
在您的第一个循环中,您从未向 tmp->next
分配任何内容,因此永远不会构建结果列表。此外,赋值 tmp = f(lst);
会覆盖上一次迭代中 tmp = tmp->next;
的结果(可能不是 well-defined/initialized)。
tmp = f(lst);
first = tmp;
while(lst)
{
tmp = f(lst);
...
您为 tmp
分配了一个值,然后立即为 tmp
分配了另一个值。因此,第一个赋值没有效果,除了值也保存在 first
中。所以这个片段相当于
first = f(lst);
while(lst)
{
tmp = f(lst);
....
但是 first
没有链接到任何其他项目。事实上,没有项目链接到任何其他项目。所以整个循环除了创建和忘记一些节点外没有任何效果,从而泄漏内存。
我有以下结构:
typedef struct s_list
{
void *content;
void content_size;
struct s_list *next;
} t_list;
我正在尝试创建一个函数:
t_list *lstmap(t_list *lst, t_list *(*f)(t_list *elem));
遍历 t_list 'lst' 的每个元素,应用函数 ' f' 到每个元素和 returns 一个新的 t_list 和新元素。
起初,我尝试了以下方法:
tmp = f(lst);
first = tmp;
while(lst)
{
tmp = f(lst);
tmp = tmp->next;
lst = lst->next;
}
没用。
然后,当这样迭代时:
tmp = f(lst);
first = tmp;
while (lst->next)
{
tmp->next = f(lst->next);
tmp = tmp->next;
lst = lst->next;
}
成功了。
为什么结果不同?
在您的第一个循环中,您从未向 tmp->next
分配任何内容,因此永远不会构建结果列表。此外,赋值 tmp = f(lst);
会覆盖上一次迭代中 tmp = tmp->next;
的结果(可能不是 well-defined/initialized)。
tmp = f(lst);
first = tmp;
while(lst)
{
tmp = f(lst);
...
您为 tmp
分配了一个值,然后立即为 tmp
分配了另一个值。因此,第一个赋值没有效果,除了值也保存在 first
中。所以这个片段相当于
first = f(lst);
while(lst)
{
tmp = f(lst);
....
但是 first
没有链接到任何其他项目。事实上,没有项目链接到任何其他项目。所以整个循环除了创建和忘记一些节点外没有任何效果,从而泄漏内存。