迭代列表 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 没有链接到任何其他项目。事实上,没有项目链接到任何其他项目。所以整个循环除了创建和忘记一些节点外没有任何效果,从而泄漏内存。