Bonjour,
J'ai quelques difficultés à comprendre le programme d'exemple de listes chaînées fourni par mon professeur.
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
41
42
43
44
45
46
47 #include <stdio.h> #include <stdlib.h> typedef struct liste { struct liste *suivant; int valeur; } LISTE; void affichage (LISTE *debut) { LISTE *p; p = debut; while (p != NULL) { printf("%d\n", p->valeur); p = p->suivant; } } LISTE *insertion (int valeur, LISTE *p) { LISTE *nouveau; nouveau = malloc(sizeof(LISTE));// allocation nouvel élément p->suivant = nouveau; // chaînage à partir du précédent nouveau->suivant = NULL; // pas encore de successeur nouveau->valeur = valeur; // stockage de la valeur return nouveau; } int main () { int i, n; LISTE *tete, *p; printf ("Taille de la liste: "); scanf ("%d", &n); p = (LISTE *) &tete; for (i=1; i<=n; i++) p = insertion(i*i, p); affichage(tete); }
Le principe de la liste chaînée en lui même ne me pose pas de problèmes, je n'arrive simplement pas à comprendre le cast (si c'en est bien un) dans le main.
Code : Sélectionner tout - Visualiser dans une fenêtre à part p = (LISTE *) &tete;
Je ne trouve pas son utilisation ici, très intuitive.
Il s'agit, si je ne m'abuse, d'attribuer à p de type LISTE* l'adresse de tete également de type LISTE*. L'adresse de tete est logiquement de type LISTE** d'où la présence du cast, qui va permettre cette affectation.
J'arrive bien à concevoir ce qu'il se passe au niveau de p, mais j'ai beaucoup plus de mal en revanche au niveau de *p.
*p doit être de type LISTE, et donc être une structure comportant deux éléments, p->suivant et p->valeur.
Or p pointe désormais sur tete qui est un simple pointeur et non une structure... la valeur de tete va-t-elle se placer dans p->suivant?
A quoi est égal p->valeur?
Pourquoi ne pas tout simplement initialiser p à p = tete?
Merci d'avance pour vos réponses!
Partager