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?
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:
vérifie si head
est NULL, si oui la liste est vide et nous retournons
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
free(tmp)
variable, et head
pointe simplement vers le reste de la liste, revenons à l'étape 1 Simplement en parcourant la liste:
struct node *n = head;
while(n){
struct node *n1 = n;
n = n->next;
free(n1);
}
Vous pouvez toujours le faire récursivement comme ceci:
void freeList(struct node* currentNode)
{
if(currentNode->next) freeList(currentNode->next);
free(currentNode);
}
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;
}
}