LinkedList - Comment libérer la mémoire allouée avec malloc
J'ai une question très simple en code C pour la construction d'une seule liste Liée comme ci-dessous, dans laquelle j'alloue de la mémoire pour chaque nœud de façon dynamique à l'aide de malloc. À la fin de code, je veux libérer la mémoire pour chaque nœud affecté, je me demandais comment aller à ce sujet - Si je commence à partir de la tête de nœud d'abord et de les libérer, les pointeurs vers les autres nœuds sont perdus et une fuite de mémoire se produit.
Autre façon est de commencer à partir de la tête de nœud et de conserver le nœud pointeur dans un autre tableau de pointeurs ou de quelque chose, la traversée de la liste jusqu'à la queue pointeur tout en stockant le nœud de pointeurs, et dès qu'il aura atteint la queue du nœud, les stocker aussi à l'autre tableau de pointeurs et de commencer à libérer du tableau de l'index vers l'arrière jusqu'à ce que le nœud de tête est gratuit ed.
Est que la seule façon de réaliser ce que je suis en train de faire?
Dans le cas où si je ne veux pas utiliser de tampon, comment dois-je faire.
#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
}
}
Vous devez vous connecter pour publier un commentaire.
La manière habituelle est avec (pseudo-code en premier):
L'idée de base est de se rappeler que le nœud libre dans une variable distincte, puis avance vers le côté avant de la libérer.
Vous avez seulement besoin de se rappeler un nœud à la fois, et non pas l'ensemble de la liste que vous proposez.
En termes de ce que vous devez ajouter à votre code, vous pouvez, lors de la suppression, l'utilisation
head
que la permanence de la mise à jour de la liste de tête (comme il devrait l'être) etcurr
pour stocker l'élément que vous êtes en train de suppression:C'est un peu plus court que le pseudo-code ci-dessus, tout simplement parce qu'il prend avantage du C "raccourci" pour certaines opérations.
- Je utiliser quelque chose comme ceci:
Gratuitement votre code doit être comme suit:
Aussi, je tiens à ajouter, après votre malloc vous voulez probablement pour vérifier si le mem a été alloué avec succès.. quelque chose comme
Vous parcourir la liste à l'aide de la même logique que ci-dessus. Vous enregistrez le curr->suivant pointeur quelque part, libre le curr struct et attribuer curr avec les sauvés curr->suivant pointeur
Contenu de Garbage Collector.h
Exemple de some_program.c
P. S.-tête systemIO est le groupe des plus des en-têtes comme ce ci-dessus! 🙂