Académique Documents
Professionnel Documents
Culture Documents
Listes chaînées
Une liste chaînée est une succession ordonnée de cellules qui sont reliées entre elles par des
pointeurs. Une cellule est une “boîte” servant à ranger des valeurs de nature quelconque. Nous
utiliserons pour simplifier des valeurs entières. Quand chaque cellule pointe vers celle qui la
succède, c’est une liste simplement chaînée. Quand une cellule pointe vers celle qui la succède
et qui la précède, c’est une liste doublement chaînée. On convient de considérer que la dernière
cellule a pour successeur NULL, tandis que la première cellule est précédée d’une tête de liste,
notée tete.
Une liste circulaire est alors une liste chaînée dont la tête succède la dernière cellule. C’est à
dire que si la liste est simplement chaînée, la dernière cellule pointe sur la tête et non sur NULL.
On peut également utiliser une liste doublement chaînée pour en faire une liste circulaire. Dans
ce cas, la dernière cellule pointe sur la tête et inversement. On peut également, pour simplifier,
ne pas utiliser de tête dans le cas d’une liste circulaire.
Une liste chaînée ordonnée (ou triée), suivant un ordre sur les valeurs de ses cellules, est une
liste pour laquelle ses cellules sont ordonnées (disons en ordre croissant) sur les valeurs des
différentes cellules de cette liste. Par exemple, si la liste comporte trois cellules A1, A2, A3
ayant respectivement les valeurs 2, 0 et 7, alors l’on doit placer en premier la cellule ayant la
valeur 0 puis celle ayant la valeur 2 et pour finir la cellule ayant la valeur 7. C’est-à-dire qu’on
aura la succession A2, A1 puis A3.
Voici maintenant les structures ainsi que les signatures des méthodes à implémenter pour réaliser
les listes chaînées. Notez-bien que les méthodes sont données seulement pour le cas des listes
simplement chaînées. Vous devez-donc les adapter pour les cas des listes doublement chaînées,
des listes circulaires et des listes chaînées ordonnées.
1
3 struct Cellule
4 {
5 int valeur ;
6 Cellule * succ ;
7 } ;
8
2
60 @pre list != NULL
61 @post list devient list ’ qui est la list sans son dernier é l é ment
62 @result -
63 */
64 void supprimeFin ( LinkedList * list ) ;
65
3
117 void detruitList ( LinkedList * list ) ;
Listes circulaires
1 // D é claration des structures pour les listes circulaires
2 // Liste circulaire simplement cha î n é e
3 typedef struct CircularLList CircularLList ;
4 struct CircularLList
5 {
6 int no ; // num é ro de la liste
7 int size ; // taille de la liste
8 Cellule * head ; // la t ê te de la liste
9 } ;
10
11 // Liste circulaire doublement cha î n é e
12 typedef struct CircularDLList CircularDLList ;
13 struct CircularDLList
14 {
15 int no ; // num é ro de la liste
16 int size ; // taille de la liste
17 DCellule * head ; // la t ê te de la liste
18 } ;
Listes ordonnées
1 // D é claration des structures pour les listes ordonn é es
2 // Liste ordonn é e simplement cha î n é e
3 typedef struct SortLList SortLList ;
4 struct SortLList
5 {
6 int no ; // num é ro de la liste
7 int size ; // taille de la liste
4
8 Cellule * head ; // la t ê te de la liste
9 } ;
10
11 // Liste ordonn é e doublement cha î n é e
12 typedef struct SortDLList SortDLList ;
13 struct SortDLList
14 {
15 int no ; // num é ro de la liste
16 int size ; // taille de la liste
17 DCellule * head ; // la t ê te de la liste
18 } ;
Piles
Une pile est une succession ordonnée de cellule ayant la caractéristique que la dernière cellule
ajoutée à la pile doit être nécessairement la première à être retirée. On dit qu’une pile est une
structure de type Last In is First Out (LIFO). Il y a seulement deux opérations de base pour
manipuler les piles : empiler - push et depiler - pop. Pour implémenter une pile, on peut
tout aussi bien se servir de listes simplement chaînées, ou de listes doublement chaînées. Dans le
cas de l’utilisation d’une liste simplement chaînée, chaque élément pointe vers son prédécesseur
(par rapport à l’ordre d’ajout des éléments) dans la pile. Le dernier élément (celui se trouvant
complètement en bas, c’est donc le plus ancien élément ajouté et qui s’y trouve toujours) de la
pile pointe alors vers NULL. Par soucis de commodités, on ajoute certaines opérations.
1 // D é claration des structures pour les piles
2 typedef struct Stack Stack ;
3 struct Stack
4 {
5 int no ; // num é ro de la liste
6 int size ; // taille de la liste
7 Cellule * head ; // la t ê te de la liste
8 } ;
9
10 /** D é termine le nombre d ’é l é ments de la Pile
11 @pre pile != null
12 @post la pile reste inchang é e
13 @return n = | pile | , le nombre d ’é l é ment dans la Pile
14 */
15 int taille ( Stack pile ) ;
16
17 /** D é termine si la pile est vide
18 @pre pile != null
19 @post pile reste inchang é e
20 @result 1 si pile == {} , 0 sinon
21 */
22 int estVide ( Stack pile ) ;
23
24 /** Ajoute la valeur val au t ê te de la pile
25 @pre pile != NULL
26 @post pile devient pile + Cellule ( val )
27 @result -
28 */
29 void empiler ( Stack * pile , int val ) ;
5
30
31 /** Enl è ve la valeur val au t ê te de la pile
32 @pre pile != NULL
33 @post pile devient pile ’ qui est la pile sans sa t ê te
34 @result -
35 */
36 void depiler ( Stack * pile ) ;
37
38 /** Initialise la pile en lui attribuant le num é ro number
39 @pre pile != NULL
40 @post pile est initialis é e et porte le num é ro number
41 @result -
42 */
43 void initPile ( Stack * pile , int number ) ;
44
45 /** Affichage de la pile sous le format
46 Cellule [0] = valeur0
47 Cellule [1] = valeur1
48 ...
49 Cellule [ n ] = valeurn
50 @pre pile != NULL
51 @post pile reste inchang ée , mais l ’ affichage selon le format sp é cifi é e
52 @result -
53 */
54 void affichePile ( Stack pile ) ;
55
56 /** Destruction de la pile
57 @pre pile != NULL
58 @post la pile est d é truite , y compris toutes ces Cellules
59 @return -
60 */
61 void detruitPile ( Stack * pile ) ;
File
Une file est également une succession ordonnée de cellules. Sa particularité est que la première
cellule entrée dans la file doit être celle qui sortira en premier de la file. On dit que c’est
une structure de type First In is First Out(FIFO). Tout comme les piles, il y aussi seulement
opérations de base pour manipuler les files : enqueue et dequeue. Enfin l’utilisation d’une liste
simplement chaînée suffit à implémenter une file.
1 // D é claration des structures pour les files
2 typedef struct Queue Queue ;
3 struct Queue
4 {
5 int no ; // num é ro de la liste
6 int size ; // taille de la liste
7 Cellule * head ; // la t ê te de la liste
8 } ;
9
10 /** D é termine le nombre d ’é l é ments de la file
11 @pre file != null
12 @post la file reste inchang é e
13 @return n = | file | , le nombre d ’é l é ment dans la file
6
14 */
15 int taille ( Queue file ) ;
16
17 /** D é termine si la file est vide
18 @pre file != null
19 @post file reste inchang é e
20 @result 1 si file == {} , 0 sinon
21 */
22 int estVide ( Queue file ) ;
23
24 /** Ajoute la valeur val à la queue de la file
25 @pre file != NULL
26 @post file devient file + Cellule ( val )
27 @result -
28 */
29 void enqueue ( Queue * file , int val ) ;
30
31 /** Enl è ve la valeur val à la t ê te de la file
32 @pre file != NULL
33 @post pile devient pile ’ qui est la pile sans sa t ê te
34 @result -
35 */
36 void dequeue ( Queue * file , int val ) ;
37