Exercice :
Simuler la fonction avec la liste suivante :
page 163
Exemple 2 :
crire une fonction "rcursive" permettant d'afficher le
contenu d'une liste linaire chane des entiers.
Solution :
void afficher( Pointeur liste)
{
if (liste)
{ printf("%5d\n", liste -> valeur );
afficher(liste -> suivant) ;
}
}
Exercice :
Simuler la fonction avec la liste suivante :
LEVAC LUC
VIAU LISE
57.8 kgs
52.4 kgs
page 164
LEVAC LUC
VIAU LISE
57.8 kgs
52.4 kgs
LEVAC LUC
VIAU LISE
1.75 mtre |
1.55 mtre > 1.67 mtre X
65.2 kgs
|
57.8 kgs
|
|
|
|
Rsums :
Ainsi, pour les besoins de la gestion d'une liste (y compris
la suppression), on aimerait avoir une fonction qui retourne
2 pointeurs :
1. cestLui qui pointe sur l'lment trouv ou vaut NULL
dans le cas contraire
2. avant qui pointe sur le prdcesseur de l'lment trouv
ou qui vaut NULL si on trouve au dbut de la liste.
2.2) Recherche dans une liste trie des personnes :
Je prsente ici un cas o la cl est une chane de caractres.
C'est plus simple si la cl est un entier :
page 165
= compare == 0 ; /* on trouve */
if (!trouve )
if ( compare < 0) /* on a la chance et on continue chercher */
{ avant = cestLui ;
cestLui = cestLui->suivant;
}
else
cestLui = NULL ; /* on ne trouve plus */
*av = avant ;
*cl = cestLui ;
Notes :
1. La fonction
strnicmp(chaine1, chaine2, k)
permet de comparer k premiers caractres de ces deux chanes
sans tenir compte des majuscules ou des minuscules. Le
rsultat (variable compare dans la fonction) est un entier :
zro
< 0
> 0
page 166
*av = avant ;
*cl = cestLui ;
Exercice 1 :
Simuler l'algorithme avec la recherche de 15 et de 20 de la
liste des entiers reprsents par le schma ci-dessus.
Exercice 2 :
Rcrire la fonction de recherche dans le cas o la cl est
un nom et un prnom et, qu'il il y a possibilit de noms doubles :
1. si la liste est trie selon le nom et prnom
2. si la liste n'est pas du tout trie.
page 167
cestLui
|
v
LEVAC LUC
VIAU LISE
57.8 kgs
52.4 kgs
Aprs la suppression:
avant
X
cestLui
|
v
LEVAC LUC
VIAU LISE
52.4 kgs
| |
On a fait :
if (avant == NULL)
liste = liste->suivant ;
else
.... venir ....
Cas 2 : lment supprimer n'est pas le premier lment de la liste
Aprs la recherche, avant la suppression:
avant
cestLui
|
|
v
v
LEVAC LUC
VIAU LISE
57.8 kgs
52.4 kgs
page 168
Aprs la suppression:
avant
cestLui
|
|
v
v
LEVAC LUC
VIAU LISE
| 57.8 kgs
| |
|
|
On a programm :
else
avant->suivant = cestLui->suivant;
Fonction de suppression :
Appel (utilisation) :
chercher(aChercher, liste, &avant, &cestLui);
if (cestLui) /* cas trouv */
{
afficher(cestLui->per);
printf("Confirmez-vous la suppression ? (O/N) ");
fflush(stdin);
if (toupper(getchar()) == 'O')
supprimer(&liste, avant, cestLui);
}
......
La fonction :
void supprimer (Pointeur * P, Pointeur avant, Pointeur cestLui)
{
if (avant == NULL) /* trouv au dbut de la liste */
*P = (*P)->suivant ;
else
avant->suivant = cestLui->suivant;
free(cestLui);
}
page 169
instructions :
RIPEAU MARC
COTE LUC
57.8 kgs
tempo
|
v
BABA ALI
1.75 mtre ?
67.8 kgs
RIPEAU MARC
COTE LUC
liste
> 1.75 mtre ----> 1.55 mtre ----> ....
|
tempo
|
65.2 kgs
57.8 kgs
|
|
|
|
v
|
|
|
|
BABA ALI
|
> 1.75 mtre |
67.8 kgs
Autrement dit :
tempo->suivant = liste ;
liste
= tempo ;
page 170
Exercice :
Peut-on crire comme suit ? :
liste = tempo ;
tempo->suivant = liste ;
Justifiez votre rponse.
Exercice :
Aprs avoir ajout le nouvel lment, peut-on faire : free (tempo);
Justifiez votre rponse.
Cas 2 : la liste est trie :
Dans ce cas, on se proccupe de l'ajouter la bonne place
(c'est--dire que la liste sera encore trie aprs l'ajout).
if (avant != NULL)
{ tempo->suivant = avant->suivant ;
avant->suivant = tempo ;
}
Cependant si on veut ajouter "AREL ERIC" dans la liste, on
aimerait qu'il soit plac au dbut de la liste.
Revenons avec la recherche de cette personne :
avant
X
LEVAC LUC
VIAU LISE
57.8 kgs
52.4 kgs
AREL ERIC
page 171
liste
BEDARD MARC
LEVAC LUC
VIAU LISE
|
1.75 mtre ----> 1.55 mtre ----> 1.67 mtre X
|
> 65.2 kgs
57.8 kgs
52.4 kgs
|
|
|
|
|
|
> AREL ERIC |
tempo > .....mtre |
.....kgs
page 172
Exemple 1 :
crire une fonction et deux appels de cette fonction pour
afficher l'cran :
- la taille moyenne
- le poids moyen
des personnes d'une liste linaire des personnes.
Solution :
float moyenne ( Pointeur liste, char codeVoulu )
{ float somme = 0.0 ;
int
n
= 0 ;
while (liste)
{ n++ ;
if (codeVoulu == 'T')
somme += liste->pers.taille ;
else
somme += liste->pers.poids ;
liste = liste->suivant ;
}
return somme / n ;
}
page 173
Appels :
printf("La taille moyenne : %6.2f mtre\n", moyenne(liste, 'T'));
printf("Le poids moyen
: %6.2f kgs\n", moyenne(liste, 'P'));
Exercice 1 :
crire une fonction et deux appels de cette fonction pour afficher
l'cran :
- la taille la plus grande et la taille la plus petite
- le poids le plus lourd et le poids le plus lger
Solution :
void creer (char * nomACreer, Pointeur liste)
{
FILE * aCreer = fopen(nomACreer, "wb");
int nbOctets = sizeof(personne);
while (liste)
{
fwrite(&(liste->pers), nbOctets, 1, aCreer);
liste = liste->suivant;
}
fclose(aCreer);
Appel :
Creer ("personne.Bin", liste);
Exercice 1 :
crire une fonction et 2 appels de cette fonction pour :
- crer un fichier binaire "GRANDE.PER" des personnes dont
la taille est suprieur 1.85 mtre ;
- crer un fichier binaire "GROS.PER" des personnes dont
le poids est suprieur 123.4 kgs ;
page 174
Exercice 2 :
crire un programme permettant de grer une pile d'entiers. Les
actions prvues sont :
- tester si une pile est vide ou non
- fournir la valeur au sommet de la pile
- ajouter un nouvel entier au sommet de la pile
- obtenir l'lment au sommet de la pile
1.47
1.63
1.70
1.75
45.81
61.23
64.86
76.20
F
M
M
M
1.78
1.65
75.75
59.87
M
F
liste ----->
1005| |
| 1101 | |
| 7606 | |
'F'
'M'
'F'
1.47 ------> 1.63 ---- ... -> 1.65 X
45.8
61.2
59.9
page 175
Solution :
/*
#include
#include
#include
#include
*/
<stdio.h>
<stdlib.h>
<string.h>
<ctype.h>
/* dclarations globales */
/* dclarer le type personne */
typedef struct
{ int
numero ;
char
sexe
;
float taille, poids ;
} personne ;
/* dclarer le type Element pour chaque lment de la liste */
typedef struct elem
{ personne pers
;
struct elem * suivant ;
}
Element;
/* dclarer le type pointeur vers un lment de la liste */
typedef Element * pointeur ;
pointeur liste;
void obtenir (char * pt)
/* Obtenir le choix de l'usager pour une option du menu */
{ char c ;
printf("Tapez
printf(" - Q
printf(" - V
printf(" - C
printf(" - A
printf(" - M
printf(" - S
printf(" - I
: \n");
pour Quitter \n");
pour Visualiser \n");
pour Chercher\n");
pour Ajouter une nouvelle personne\n");
pour Modifier les informations d'une personne\n");
pour Supprimer une personne de la liste\n");
pour visualiser la liste Inverse \n");
do
{
printf("\n\n");
printf("Entrez votre choix parmi Q, V, C, A, M, S ou I >> ");
fflush(stdin);
c = toupper(getchar());
} while ( strchr("QVCAMSI", c) == NULL );
/* quivalent : while ( c != 'Q' && c != 'V' && c != 'C' && c != 'A'
&& c != 'M' && c != 'S' && c != 'I' ); */
*pt = c ;
}
page 176
printf("\n\nNumro
printf("taille
printf("poids
printf("sexe
: %6d\n", unePers.numero);
: %6.2f\n", unePers.taille);
: %6.1f\n", unePers.poids );
: %s\n", toupper(unePers.sexe) == 'F' ?
"Fminin" : "Masculin") ;
}
void demander ( personne * ptr )
{ personne unePers;
printf("Entrez les informations de la personne : ");
printf(" - Numro : ");
scanf("%d", &(unePers.numero));
flushall();
printf(" - sexe
: ");
unePers.sexe = toupper(getche());
printf(" - taille : ");
scanf("%f", &(unePers.taille));
printf(" - poids : ");
scanf("%f", &(unePers.poids)) ;
}
*ptr = unePers;
page 177
if (
{
}
}
}
}
*L = laListe;
page 178
void find (int aChercher, pointeur liste, pointeur * av, pointeur * cl)
/* donnez la valeur aChercher, je cherche dans la liste et vous
retourne deux pointeurs :
1) *cl qui pointe vers rien si on ne le trouve pas
vers l'lment on cherche si on le trouve
2) *av
1005
1257
5545
'F'
'M'
'F'
liste -----> 1.62 ------> 1.58 ---- ... -> 1.55 X
56.5
62.5
42.7
*/
{ pointeur avant, cestLui ;
avant = NULL ;
cestLui = liste ;
while ( cestLui && (cestLui->pers).numero < aChercher )
{ avant
= cestLui;
cestLui = cestLui->suivant ;
}
/* si on ne le trouve pas, on met le cestLui NULL */
if (cestLui && (cestLui->pers).numero != aChercher)
cestLui = NULL;
*av = avant ;
*cl = cestLui ;
}
page 179
= aContourner->suivant ;
aContourner->suivant = liste ;
liste
= aContourner ;
aContourner
= leSuivant;
*L = liste ;
}
void chercher (pointeur liste)
{ pointeur cestLui, avant ;
int aChercher;
do
{
printf("Quelques numros existants
: 1005, 1101, 1707, 7104, 7506\n");
printf("Quelques numros inexistants : 1899, 2222, 5678\n");
printf("Entrez le numro de la personne chercher ");
scanf("%d", &aChercher);
find (aChercher,liste, &avant, &cestLui);
if (cestLui != NULL) /* on le trouve */
{
printf("\nYOUPI! on l'a trouv : \n");
afficher(cestLui -> pers);
}
else
printf("Dsol! on ne trouve pas cette personne\n");
/* exemple "pdagogique" */
if (avant == NULL)
printf("avant vaut NULL\n");
else
printf("valeur avant : %5d\n", avant->pers.numero);
printf("avez-vous une autre personne chercher (O/N) ? ");
fflush(stdin);
}
while (toupper(getchar()) != 'N');
}
void eliminer ( pointeur * P, pointeur avant, pointeur cestLui)
{
if
(avant == NULL) /* au dbut de la liste */
*P = (*P)->suivant ; /* on fait avancer la liste */
else avant->suivant = cestLui->suivant;
}
page 180
1005
1257
'F'
'M'
liste -----> 1.62 ------> 1.58 ---- ...
56.5
62.5
a) On supprime :
avant
cestLui
v
v
1005
1257
'F'
'M'
liste -----> 1.62 --- 1.58 ------->
56.5 |
62.5
-->
|
|
|-----------------|
*/
{
5545
'F'
-> 1.55 X
42.7
1265
'M'
1.75 ----> ....
92.7
}
while (toupper(getche()) != 'N');
page 181
avant
cestLui X
|
1005
1257
5545
'F'
'M'
'F'
liste -----> 1.62 ------> 1.58 ---- ... -> 1.55 X
56.5
62.5
42.7
b) on ajoute :
avant
v
1005
1257
'F'
'M'
liste -----> 1.62 ---- 1.58 ----> ...
56.5 |
|---> 62.5
|
|
| |
--> 1100 |
tempo----> ....---....
*/
{
page 182
page 183
void main()
{ char choix ; /* option d'un menu */
creerFIFO (&liste);
do
{ obtenir(&choix);
traiter(choix, &liste) ;
}
while (choix != 'Q');
Excution :
Tapez
- Q
- V
- C
- A
- M
- S
- I
:
pour
pour
pour
pour
pour
pour
pour
Quitter
Visualiser
Chercher
Ajouter une nouvelle personne
Modifier les informations d'une personne
Supprimer une personne de la liste
visualiser la liste Inverse
45.81
61.23
64.86
76.20
57.61
55.34
44.91
51.71
64.41
50.80
66.22
58.51
65.32
60.33
56.25
71.67
82.10
63.05
75.75
74.84
F
M
M
M
F
F
F
F
F
F
F
F
M
F
M
M
M
F
M
M
page 184
:
pour
pour
pour
pour
pour
pour
pour
Quitter
Visualiser
Chercher
Ajouter une nouvelle personne
Modifier les informations d'une personne
Supprimer une personne de la liste
visualiser la liste Inverse
:
pour
pour
pour
pour
pour
pour
pour
Quitter
Visualiser
Chercher
Ajouter une nouvelle personne
Modifier les informations d'une personne
Supprimer une personne de la liste
visualiser la liste Inverse
page 185
:
pour
pour
pour
pour
pour
pour
pour
Quitter
Visualiser
Chercher
Ajouter une nouvelle personne
Modifier les informations d'une personne
Supprimer une personne de la liste
visualiser la liste Inverse
:
1005
:
1.47
:
45.8
: Fminin
page 186
Numro
sexe
taille
poids
:
:
:
:
1005
f
1.67
48.5
:
pour
pour
pour
pour
pour
pour
pour
Quitter
Visualiser
Chercher
Ajouter une nouvelle personne
Modifier les informations d'une personne
Supprimer une personne de la liste
visualiser la liste Inverse
Numro
sexe
taille
poids
Tapez
- Q
- V
- C
- A
- M
- S
- I
:
pour
pour
pour
pour
pour
pour
pour
:
:
:
:
2345
m
1.67
67.8
Quitter
Visualiser
Chercher
Ajouter une nouvelle personne
Modifier les informations d'une personne
Supprimer une personne de la liste
visualiser la liste Inverse
M
F
page 187
3)
4)
5)
6)
7)
8)
9)
10)
11)
12)
13)
14)
15)
16)
17)
18)
19)
20)
7603
7602
7601
7507
7506
7505
7502
7501
7407
7405
7404
7403
7402
7401
7307
7305
7304
7303
1.60
1.65
1.63
1.73
1.68
1.73
1.70
1.65
1.75
1.70
1.83
1.80
1.63
1.63
1.70
1.80
1.65
1.75
48.99
53.07
47.63
72.57
54.43
65.32
60.78
61.69
71.67
63.50
86.18
79.38
53.52
54.88
56.25
89.36
64.41
63.96
F
F
F
M
F
M
F
M
M
F
M
M
F
F
F
M
M
F
:
pour
pour
pour
pour
pour
pour
pour
Quitter
Visualiser
Chercher
Ajouter une nouvelle personne
Modifier les informations d'une personne
Supprimer une personne de la liste
visualiser la liste Inverse
page 188