bonsoir

Je suis actuellement en phase d'apprentissage des listes chainées. Pour cela j'utilise le site d'Emmanuel Delahaye .

http://emmanuel-delahaye.developpez....s_chainees.htm

Je fais un petit blocage sur les fonctions de bases que sont affichages de la liste et ajout d'un element en fin de liste.

ajout en fin
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
40
 
struct node *add_end (struct node *p_head, int value)
{
   /* allocation du noeud */
   struct node *p_new = malloc (sizeof *p_new);
 
   /* si tout s'est bien passe : */
   if (p_new != NULL)
   {
      /* mise a jour des champs : */
 
      /* donnees */
      p_new->x = value;
 
      /* chainage par defaut */
      p_new->p_next = NULL;
 
      /* chainage */
      if (p_head == NULL)
      {
         /* c'est le premier : */
         p_head = p_new;
      }
      else
      {
         /* on cherche le dernier noeud */
         struct node *p = p_head;
 
         while (p->p_next != NULL)
         {
            /* pointer sur le suivant */
            p = p->p_next;
         }
 
         /* modification du chainage */
         p->p_next = p_new;
      }
   }
   return p_head;
}

affichage

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
 
void display (struct node *p_head)
{
   struct node *p = p_head;
 
   while (p != NULL)
   {
      /* afficher les données courantes */
      printf ("%d > ", p->x);
 
      /* pointer sur le suivant */
      p = p->p_next;
   }
   /* afficher la fin */
   printf ("NIL\n");
}
Dans les deux fonctions on déclare un pointeur sur node et on lui affecte la liste pour la parcourir.

Dans add_end on a ainsi

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
 struct node *p = p_head;
 
         while (p->p_next != NULL)
         {
            /* pointer sur le suivant */
            p = p->p_next;
....
et dans display on a

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
 
struct node *p = p_head;
 
 while (p != NULL)
   {
      /* afficher les données courantes */
      printf ("%d > ", p->x);
 
      /* pointer sur le suivant */
      p = p->p_next;
La création du pointeur p est identique dans les deux fonctions mais la condition de parcours dans le while est différentes :s. Et je ne comprend pas trop pourquoi.


Ensuite dans add_end on renvoie la liste passé en paramètre. hors dans le code on affecte au pointeur p la liste passée au paramètre puis on ajoute le nouvel élément au pointeur p. La fonction se termine avec le renvoie en valeur de la sortie du pointeur p_head. Comment le nouvel élément est affecté à la liste p_head ? Puisque celui-ci est rajouté au pointeur temporaire p :s.

Je ne sais aps si je suis clair.

En tout cas félicitation à l'auteur du site il est trés clair

(j'ai juste du mal avec les files )