LinkedList - Cómo liberar la memoria asignada usando malloc

Tengo un código C muy simple para construir una lista Singly Linked como se muestra a continuación, en la que asigno memoria para cada nodo dinámicamente usando malloc. Al final del código, quiero liberar la memoria para cada nodo asignado, me preguntaba cómo hacerlo: si empiezo desde el nodo principal primero y lo libero, los punteros a los nodos posteriores se pierden y se produce una pérdida de memoria.

Otra forma es comenzar desde el nodo principal y seguir almacenando el puntero del nodo en una matriz separada de punteros o algo así, recorrer la lista hasta el puntero de cola mientras almacena los punteros de nodo, y una vez que llegue al nodo de cola, almacene eso también en la otra matriz de punteros y comience a liberarse de ese índice de matriz hacia atrás hasta que el nodo principal se libere.

Es esa la única forma de lograr lo que estoy tratando de hacer?

En caso de que no quiera usar el segundo búfer, ¿cómo lo hago?

#include "stdio.h"
#include "stdlib.h"

struct lnk_lst 
{
   int val;
   struct lnk_lst * next;
};

typedef struct lnk_lst item;


main()
{
   item * curr, * head;
   int i,desired_value;

   head = NULL;

   for(i=1;i<=10;i++) 
   {
      curr = (item *)malloc(sizeof(item));
      curr->val = i;
      curr->next  = head;
      head = curr;
   }

   curr = head;


   while(curr) {
      printf("%d\n", curr->val);
      curr = curr->next;
   }

  //How to free the memory for the nodes in this list?
   for(i=1;i<=10;i++)
   {
       free()//?? What logic here
   }


}

Respuestas a la pregunta(5)

Su respuesta a la pregunta