web-dev-qa-db-fra.com

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

Comment vais-je libérer les nœuds alloué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 libérer la tête, deuxième et troisième variables.
Merci.

Mettre à 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 impressions 2. Ne devrait pas appeler gratuitement (h) supprimer h. Si oui, pourquoi est-ce que h-> suivant-> données sont disponibles, si h est libre. Bien entendu, le «second» noeud n'est pas libéré. Mais puisque la tête est supprimée, il devrait pouvoir référencer le prochain élément. Quelle est l'erreur ici? 

21
user235273

Une fonction itérative pour libérer votre liste:

void freeList(struct node* head)
{
   struct node* tmp;

   while (head != NULL)
    {
       tmp = head;
       head = head->next;
       free(tmp);
    }

}

Ce que fait la fonction est la suivante:

  1. vérifie si head est NULL, si oui la liste est vide et nous retournons

  2. Enregistrez la head dans une variable tmp et faites pointer head sur le prochain nœud de votre liste (cette opération est effectuée dans head = head->next

  3. Maintenant, nous pouvons en toute sécurité free(tmp) variable, et head pointe simplement vers le reste de la liste, revenons à l'étape 1 
45
insumity

Simplement en parcourant la liste:

struct node *n = head;
while(n){
   struct node *n1 = n;
   n = n->next;
   free(n1);
}
3
elcuco

Vous pouvez toujours le faire récursivement comme ceci:

void freeList(struct node* currentNode)
{
    if(currentNode->next) freeList(currentNode->next);
    free(currentNode);
}
1
Bradley Swain

Une fonction peut faire le travail,

void free_list(node *pHead)
{
    node *pNode = pHead, *pNext;

    while (NULL != pNode)
    {
        pNext = pNode->next;
        free(pNode);
        pNode = pNext;
    }

}
0
Mehul