Перебирает список 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
затем не связан ни с каким другим элементом. На самом деле ни один элемент не связан с другим элементом. Таким образом, весь цикл не имеет никакого эффекта, кроме создания и забывания некоторых узлов и, как следствие, утечки памяти.