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.


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!