TP5: Properly guard against NULL testing an element in the searching
[Algorithmic_C.git] / TP5 / exo4 / liste_chainee.c
CommitLineData
3f0f8bfd
JB
1/********************************************************************/
2/* Implantation d'une liste triee d'entiers */
3/********************************************************************/
4#include <stdio.h>
5#include <stdlib.h>
ef5acd44 6#include <stdbool.h>
3f0f8bfd
JB
7
8typedef int element;
9
10typedef struct cellule {
11 element valeur;
12 struct cellule *suivant;
13} Cellule, *Liste;
14
15Liste ajouter_iter(element e, Liste L)
16{
17 Cellule *pc, *p1 = L, *p2 = NULL;
18
19 pc = (Cellule *) malloc(sizeof(Cellule));
20 pc->valeur = e;
21 pc->suivant = NULL;
22
23 if (!L) /* liste vide */
24 return pc;
25
26 while (p1 && (e >= p1->valeur)) {
27 p2 = p1;
28 p1 = p1->suivant;
29 }
30
31 if (!p2) { /* insertion en tete */
32 pc->suivant = L;
33 L = pc;
34 } else { /* insertion entre p2 et p1 */
35 p2->suivant = pc;
36 pc->suivant = p1;
37 }
38
39 return L;
40}
41
42int longueur_iter(Liste L)
43{
44 int longueur = 0;
45
105fac43 46 while (L != NULL) {
3f0f8bfd
JB
47 L = L->suivant;
48 longueur++;
49 }
50 return longueur;
51}
52
53int longueur_rec(Liste L)
54{
105fac43
JB
55 if (L != NULL) {
56 return 1 + longueur_rec(L->suivant);
57 } else {
58 return 0;
59 }
3f0f8bfd
JB
60}
61
62void visualiser_iter(Liste L)
63{
ca2c69d5
JB
64 int compteur = 0;
65
66 printf("--Debut--\n");
67 while (L != NULL) {
68 printf("L[%d]->value=%d\n", compteur, L->valeur);
69 L = L->suivant;
70 compteur++;
71 }
72 printf("--Fin--\n");
73}
74
75void _visualiser_rec(Liste L, int compteur)
76{
77 if (L != NULL) {
ef5acd44
JB
78 if (compteur == 0)
79 printf("--Debut--\n");
ca2c69d5
JB
80 printf("L[%d]->value=%d\n", compteur, L->valeur);
81 compteur++;
82 _visualiser_rec(L->suivant, compteur);
83 if (compteur == (longueur_rec(L) - 1))
84 printf("--Fin--\n");
85 }
86
3f0f8bfd
JB
87}
88
89void visualiser_rec(Liste L)
90{
ca2c69d5
JB
91 int compteur = 0;
92
ca2c69d5 93 _visualiser_rec(L, compteur);
3f0f8bfd
JB
94}
95
ef5acd44 96bool rechercher_iter(element e, Liste L)
3f0f8bfd 97{
ef5acd44
JB
98 bool rt_val = false;
99
100 while (L != NULL && L->valeur != e) {
101 L = L->suivant;
cdc1c7e2
JB
102 if (L->valeur == e)
103 rt_val = true;
ef5acd44 104 }
ef5acd44 105 return rt_val;
3f0f8bfd
JB
106}
107
108Liste rechercher_rec(element e, Liste L)
109{
3f0f8bfd
JB
110}
111
112Liste ajouter_rec(element e, Liste L)
113{
114 /* ... */
115}
116
117Liste supprimer_iter(element e, Liste L)
118{
119 /* ... */
120}
121
122Liste supprimer_rec(element e, Liste L)
123{
124 /* ... */
125}
126
127Liste inverser_iter(Liste L)
128{
129 /* ... */
130}
131
132Liste inverser_rec(Liste L)
133{
134 /* ... */
135}
136
137/****************************************************************************/
138int main()
139{
140 int x;
141 Liste L = NULL;
105fac43
JB
142 L = ajouter_iter(2, L);
143 L = ajouter_iter(1, L);
144 L = ajouter_iter(3, L);
ca2c69d5 145 printf("Saisir un entier a ajouter a la liste L\n");
3f0f8bfd
JB
146 scanf("%d", &x);
147 L = ajouter_iter(x, L);
ca2c69d5 148 printf("L a pour longueur %d\n", longueur_rec(L));
3f0f8bfd 149 visualiser_iter(L);
ca2c69d5 150 visualiser_rec(L);
ef5acd44
JB
151 if (rechercher_iter(3, L))
152 printf("Element 3 est present dans L\n");
3f0f8bfd
JB
153 /* ... */
154}
155
156/****************************************************************************/