Перебирает список lst и применяет функцию f к каждой ссылке, чтобы создать "свежий" список

У меня есть следующая структура:

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' к каждому элементу и возвращает новый 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;
}

Это сработало.

Почему они отличаются в результате?

2 ответа

Решение

В первом цикле вы никогда ничего не назначаете tmp->next, поэтому список результатов никогда не создается. Кроме того, назначение tmp = f(lst); перезаписывает результат tmp = tmp->next; из предыдущей итерации (которая, вероятно, не является четко определенной / инициализированной).

tmp = f(lst);
first = tmp;
while(lst)
{
    tmp = f(lst);
    ...

Вы назначаете значение tmp а затем сразу же назначить другое значение tmp, Первое назначение, таким образом, не имеет никакого эффекта, за исключением того, что значение также сохраняется в first, Так что этот фрагмент эквивалентен

 first = f(lst);
 while(lst)
 {
      tmp = f(lst);
      ....

Но first затем не связан ни с каким другим элементом. На самом деле ни один элемент не связан с другим элементом. Таким образом, весь цикл не имеет никакого эффекта, кроме создания и забывания некоторых узлов и, как следствие, утечки памяти.

Другие вопросы по тегам