C: Comment libérer des nœuds dans la liste chaînée?

Comment vais-je gratuit les nœuds affectés dans une autre fonction?

struct node {
    int data;
    struct node* next;
};

struct node* buildList()
{
    struct node* head = NULL;
    struct node* second = NULL;
    struct node* third = NULL;

    head = malloc(sizeof(struct node));
    second = malloc(sizeof(struct node));
    third = malloc(sizeof(struct node));

    head->data = 1;
    head->next = second;

    second->data = 2;
    second->next = third;

    third->data = 3;
    third->next = NULL;

    return head;
}  

J'appelle la fonction buildList dans le main()

int main()
{
    struct node* h = buildList();
    printf("The second element is %d\n", h->next->data);
    return 0;
}  

Je veux gratuit de tête, deuxième et troisième variables.
Merci.

Mise à jour:

int main()
{
    struct node* h = buildList();
    printf("The element is %d\n", h->next->data);  //prints 2
    //free(h->next->next);
    //free(h->next);
    free(h);

   //struct node* h1 = buildList();
    printf("The element is %d\n", h->next->data);  //print 2 ?? why?
    return 0;
}

Les deux copies 2. Ne devrait pas appeler free(h) retirer h. Si oui, pourquoi est-ce que h->next->données disponibles, si h est libre. Bien sûr, la "seconde" nœud n'est pas libéré. Mais puisque la tête est enlevée, il devrait être en mesure de faire référence à l'élément suivant. Ce qui est ici l'erreur?

source d'informationauteur 53E3916A