Bonjour,

Je travail sur un projet en C dans lequel j'utilise de longues listes chainées...

Voici un exemple de liste :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
struct data_POSS
{
   int valide;
   int Tab1[50];
   int Tab2[200];
};
 
struct node_POSS
{
   struct data_POSS data;
   struct node_POSS *psuiv;
   struct node_POSS *pprec;
};
 
struct liste_POSS
{
   struct node_POSS *pTete;
   struct node_POSS *pQueue;
   int Nb_Elements;
};
Ensuite je l'instancie de la manière suivante :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
void add_POSS (struct liste_POSS *p_liste, struct data_POSS *p_data)
{
   struct node_POSS *pNouveau = malloc (sizeof *pNouveau);
   if (pNouveau != NULL)
   {
      pNouveau->data = *p_data;
      pNouveau->psuiv = NULL;
 
      if (p_liste->pTete == NULL)
      {
      /* Premier maillon = Premiere Ligne */
         p_liste->pTete = pNouveau;
         pNouveau->pprec = NULL;
      }
      else
      {
         p_liste->pQueue->psuiv = pNouveau;
         pNouveau->pprec = p_liste->pQueue;
      }
      p_liste->pQueue = pNouveau;
   }
}
 
void Create_liste (struct liste_POSS *p_POSS)
{
  int i, j;
  struct data_POSS data_CP;
 
  p_POSS->Nb_Elements = 0;
 
  for (i=0;i<65534;i++)
    {
	data_CP.valide=1;
	for (j=0;j<50;j++) {data_CP.Tab1[j]=0;}
	for (j=0;j<200;j++) {data_CP.Tab2[j]=0;}
 	add_POSS(p_POSS, &data_CP);
	p_POSS->Nb_Elements = p_POSS->Nb_Elements + 1;
     }                                        
}
Dans mon Main.c j'appelle la fonction Create_liste afin de créer une chaine.
Après, avoir travaillé sur cette chaine j'essaie de la réinitialiser en rappelant la fonction Create_liste...

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
void Main ()
{
     int i;
     struct liste_POSS TOTO_liste = {NULL, NULL, 0};
 
     for (i=0;i<5;i++) 
     {
          Create_liste(&TOTO_liste);
 
        // UTILISATION et TRAITEMENT DE LA LISTE
 
     }
Or, la fonction Create_liste ne donne pas a chaque fois le même nombre d'éléments dans la liste chainée... au début j'ai bien 35535, puis ensuite ca diminue...
Mon programme est assez gros, et utilise beaucoup de liste et liste de liste...
Aussi, je me suis dit que c'etait peut etre un probleme mémoire et j'ai ajouté:

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
void liberation_Mem (struct liste_POSS *C_POSS)
{
     struct node_POSS *p_sw = C_POSS->pTete;
     struct node_POSS *p_tmp;
 
     while (p_sw!=NULL)
     {
           p_tmp = p_sw->psuiv;
           free(p_sw);
           C_POSS->pTete = p_tmp;
 
           p_sw = C_POSS->pTete;
     }    
}
 
void Main ()
{
     int i;
     struct liste_POSS TOTO_liste = {NULL, NULL, 0};
 
     for (i=0;i<5;i++) 
     {
          Create_liste(&TOTO_liste);
 
        // UTILISATION et TRAITEMENT DE LA LISTE
 
          liberation_Mem (&TOTO_liste );
 
     }
Est ce que la libération de mémoire est correcte?

Merci pour votre aide,

Alex