Upload
anonymous-wtpasa8
View
214
Download
0
Embed Size (px)
Citation preview
7/26/2019 chapitre9.doc
1/26
Chapitre 9 : liste linaire chane (suite)
Manipulation d'une liste linaire chane :
1) Affichage le contenu d'une liste linaire chane :
Pour parcourir un tableau on utilise les indices :
for ( i = 0 ; i < nbElem ; i++) .....
Pour parcourir un fichier, comme on n'a pas d'indices, on utilise la boucle hile :
hile (!feof(...)) ....
Pour parcourir une liste lin"aire cha#n"e :
$. on utilise la boucle : hile (liste != %&) .....
ou plus court :
hile (liste) .....
. on aance dans la liste pour cha*ue tour de boucle :
liste = listesuiant ; - liste pointe comme son /suiant/ -
Eemple $ :
1crire une fonction permettant d'afficher le contenu d'une liste lin"aire cha#n"e des entiers.
2olution :
oid afficher( Pointeur liste) 3 hile (liste) - 4ant*ue la liste soit non ide -
3 printf(/56d7n/, liste aleur );
liste = liste suiant ; - aancer dans la liste -
8 8
Eercice :
2imuler la fonction aec la liste suiante :
9 9 9 liste $0 $6 > ?@@ ?@@ ?@@
Chapitre 9 : liste linaire chane (suite) page163
7/26/2019 chapitre9.doc
2/26
Eemple :
1crire une fonction /r"cursie/ permettant d'afficher le contenu d'une liste lin"aire cha#n"e des entiers.
2olution :
oid afficher( Pointeur liste) 3 if (liste) 3 printf(/56d7n/, liste aleur ); afficher(liste suiant) ; 8 8
Eercice :
2imuler la fonction aec la liste suiante :
9 9 9
liste A0 $6 BC > ?@@ ?@@ ?@@
2) Recherche d'un lment dans une liste linaire chane :
.$) Daisons d'une recherche :
n cherche un "l"ment de la liste :
$. pour une consultation (cas trFs fr"*uent) . pour une suppresion (eemple : cas d'abandon dans un
sGstFme d'inscription) . pour une modification (eemple : chanHements de notes dans un sGstFme de Hestion des notes) etc ....
Pour les besoins de consultation, il suffit d'aoir un pointeur *ui :
. pointe ers rien si on ne troue pas & . pointe ers l'"l"ment trou"
2i on cherche /EIJK &K/ et si on dispose d'un pointeur /cestui/ :
cestui
L 9 9 9 liste MENJDN OJDK EIJK &K IJ& 2E $.Q6 mFtre $.66 mFtre $.AQ mFtre > A6. RHs 6Q.S RHs 6.B RHs ?@@ ?@@ ?@@
on est capable de faire : afficher(cestuipers) ; oT pers est le premier champ du tGpe Element.
Chapitre 9 : liste linaire chane (suite) page164
7/26/2019 chapitre9.doc
3/26
2i on a besoin de corriHer la taille de /EIJK &K/ : $Q6 mFtre au lieu de $.66 mFtre, il suffit de faire :
cestuipers.taille = $.Q6 ;
Kependant, si on a besoin de supprimer /EIJK &K/ de la liste, le pointeur cestui n'est pas suffisant.
2upposons *u'on dispose d'un autre pointeur du nom /aant/ *ui pointe ers le pr"d"cesseur de l'"l"ment trou" :
aant cestui L L 9 9 9 liste MENJDN OJDK EIJK &K IJ& 2E $.Q6 mFtre $.66 mFtre $.AQ mFtre > A6. RHs 6Q.S RHs 6.B RHs
?@@ ?@@ ?@@
Pour supprimer /EIJK &K/, il suffit de faire comme suit :
aantsuiant = cestuisuiant ;
aant cestui L L 9 9 9 liste MENJDN OJDK EIJK &K IJ& 2E $.Q6 mFtre L $.66 mFtre UUUUUUUU $.AQ mFtre > A6. RHs L 6Q.S RHs VUUU 6.B RHs ?@L@ ?@@ L ?@@ L L WUUUUUUUUUUUUUUUUUUUUUUUUX
D"sum"s :
Jinsi, pour les besoins de la Hestion d'une liste (G compris la suppression), on aimerait aoir une fonction *ui retourne pointeurs :
$. cestui *ui pointe sur l'"l"ment trou" ou aut %&
dans le cas contraire
. aant *ui pointe sur le pr"d"cesseur de l'"l"ment trou" ou *ui aut %& si on troue au d"but de la liste.
.) Decherche dans une liste tri"e des personnes :
Ye pr"sente ici un cas oT la cl" est une cha#ne de caractFres. K'est plus simple si la cl" est un entier :
Chapitre 9 : liste linaire chane (suite) page165
7/26/2019 chapitre9.doc
4/26
oid chercher ( char aKhercher, Pointeur liste, Pointeur a, Pointeur cl)
3 int lonHueur = strlen(aKhercher), compare , troue ; Pointeur aant, cestui ; - comme a et cl -
- nitialisation : -
aant = %& ; cestui = liste ; troue = 0 ; - Zau, on ne troue pas encore -
hile (cestui [[ !troue) 3 compare = strnicmp (cestuipers.nomPre, aKhercher, lonHueur);
troue = compare == 0 ; - on troue -
if (!troue )
if ( compare < 0) - on a la chance et on continue \ chercher - 3 aant = cestui ; cestui = cestuisuiant; 8 else cestui = %& ; - on ne troue plus - 8
a = aant ; cl = cestui ; 8
%otes :
$. a fonction : strnicmp(chaine$, chaine, R) permet de comparer R premiers caractFres de ces deu cha#nes sans tenir compte des ma]uscules ou des minuscules. e r"sultat (ariable compare dans la fonction) est un entier :
^"ro : elles sont pareilles dans les R premiers caractFres < 0 : chaine$ < chaine dans les R premiers caractFres 0 : chaine$ chaine dans les R premiers caractFres
. Pour cha*ue tour de la boucle de recherche :
2i compare aut ^"ro, on troue. K'est r"Hl".
2i compare < 0, on ne troue pas encore mais, on a *uand m_me la chance car le nom de la personne rendue (eemple /MENJDN OJDK/) est plus petit *ue le nom recherch" (ici /EIJK &K/). Nans ce cas, aant prend la position de cestui et on aance cestui.
Chapitre 9 : liste linaire chane (suite) page166
7/26/2019 chapitre9.doc
5/26
2i on cherche /JIE YJK`&E2/ et *u'on troue plutt /EIJK &K/, dans ce cas on a compare 0 et on n'aura ]amais la chance de trouer /JIE YJK`&E2/ car la liste est tri"e. n affecte %& \ cestui pour siHnaler *u'on ne rencontre pas /JIE YJK`&E2/.
. %ote^ *ue :
a) la recherche de /MENJDN OJDK/ donne %& au pointeur aant. Nans ce cas, cestui *ui est non %& alors *ue aant aut %& siHnale *u'on troue au d"but de la liste. Kette information est pr"cieuse pour la suppression.
b) la recherche de /JIE YJK`&E2/ est "chou"e. cestui aut %& pour siHnaler *u'on ne le troue pas. Kependant aant pointe sur /MENJDN OJDK/ (le pr"d"cesseur imm"diat si /JIE YJK`&E2/ est dans la liste). Kette information est pr"cieuse pour l'a]out de /JIE YJK`&E2/ dans la liste.
.) Decherche dans une liste non tri"e :
Ye pr"sente ici un cas oT la cl" est un entier.
9 9 9 liste A0 $6 BC > ?@@ ?@@ ?@@
oid chercher(int aKhercher, Pointeur liste, Pointeur a, Pointeur cl) 3 Pointeur aant = %&, cestui = liste ;
- 2i on ne troue pas, on aance dans la liste - hile (cestui [[ cestuialeur != aKhercher) 3 aant = cestui ; cestui = cestuisuiant ; 8
a = aant ; cl = cestui ; 8
Eercice $ :
2imuler l'alHorithme aec la recherche de $6 et de 0 de la liste des entiers repr"sent"s par le sch"ma cidessus.
Eercice :
D""crire la fonction de recherche dans le cas oT la cl" est un nom et un pr"nom et, *u'il il G a possibilit" de noms doubles :
$. si la liste est tri"e selon le nom et pr"nom . si la liste n'est pas du tout tri"e.
Chapitre 9 : liste linaire chane (suite) page167
7/26/2019 chapitre9.doc
6/26
3) uppression d'un lment dans une liste linaire chane :
Kas $ : "l"ment \ supprimer est le premier "l"ment de la liste
Nans ce cas : cestui != %& et aant == %&
JprFs la recherche, aant la suppression:
aant cestui > L 9 9 9 liste MENJDN OJDK EIJK &K IJ& 2E $.Q6 mFtre $.66 mFtre $.AQ mFtre > A6. RHs 6Q.S RHs 6.B RHs ?@@ ?@@ ?@@
JprFs la suppression:
aant cestui > L 9 9 9 liste U MENJDN OJDK EIJK &K IJ& 2E L $.Q6 mFtre $.66 mFtre $.AQ mFtre > L A6. RHs VU 6Q.S RHs 6.B RHs L ?@@ L ?@@ ?@@ WUUUUUUUUUUUUUUUUUUUUX n a fait :
if (aant == %&) liste = listesuiant ; else .... \ enir ....
Kas : "l"ment \ supprimer n'est pas le premier "l"ment de la liste
JprFs la recherche, aant la suppression:
aant cestui L L
9 9 9 liste MENJDN OJDK EIJK &K IJ& 2E $.Q6 mFtre $.66 mFtre $.AQ mFtre > A6. RHs 6Q.S RHs 6.B RHs ?@@ ?@@ ?@@
Chapitre 9 : liste linaire chane (suite) page168
7/26/2019 chapitre9.doc
7/26
JprFs la suppression:
aant cestui L L 9 9 9 liste MENJDN OJDK EIJK &K IJ& 2E $.Q6 mFtre UUUU $.66 mFtre $.AQ mFtre > A6. RHs L 6Q.S RHs VU 6.B RHs ?@@ L ?@@ L ?@@ L L WUUUUUUUUUUUUUUUUUUUUX
n a proHramm" :
else aantsuiant = cestuisuiant;
Zonction de suppression :
Jppel (utilisation) :
chercher(aKhercher, liste, [aant, [cestui); if (cestui) - cas trou" - 3 afficher(cestuiper);
printf(/Konfirme^ous la suppression (-%) /); fflush(stdin); if (toupper(Hetchar()) == '')
supprimer([liste, aant, cestui); 8 ......
a fonction :
oid supprimer (Pointeur P, Pointeur aant, Pointeur cestui)
3 if (aant == %&) - trou" au d"but de la liste -
P = (P)suiant ;
else aantsuiant = cestuisuiant;
free(cestui);
8
Chapitre 9 : liste linaire chane (suite) page169
7/26/2019 chapitre9.doc
8/26
!) A"out d'un nou#el lment:
Kas $ : la liste n'est pas tri"e :
Nans un tel cas, il suffit d'a]outer, par eemple, au d"but
de la liste (le cas d'une pile (d'assiettes!)) : aec ces instructions :
obtenir([nouPers) ; - informations d'une nouelle personne -
tempo = (Element ) malloc (si^eof(Element));
tempopers = nouPers ;
on a ce *ui suit :
9 9 DPEJ& OJDK K4E &K liste $.Q6 mFtre $.66 mFtre .... A6. RHs 6Q.S RHs tempo UUUUUU ?@@ ?@@ L 9 MJMJ J $.Q6 mFtre AQ.S RHs ?@@
Ke *u'on eut, finalement, est :
9 9 DPEJ& OJDK K4E &K liste VUU $.Q6 mFtre $.66 mFtre .... L tempo L A6. RHs 6Q.S RHs L L L ?@@ ?@@ L L L 9L L MJMJ J L WUU $.Q6 mFtre L AQ.S RHs ?@@
Jutrement dit :
temposuiant = liste ; liste = tempo ;
Chapitre 9 : liste linaire chane (suite) page170
7/26/2019 chapitre9.doc
9/26
Eercice :
Peuton "crire comme suit :
liste = tempo ; temposuiant = liste ;
Yustifie^ otre r"ponse.
Eercice :
JprFs aoir a]out" le nouel "l"ment, peuton faire : free (tempo); Yustifie^ otre r"ponse.
Kas : la liste est tri"e :
Nans ce cas, on se pr"occupe de l'a]outer \ la bonne place
(c'est\dire *ue la liste sera encore tri"e aprFs l'a]out).
if (aant != %&) 3 temposuiant = aantsuiant ; aantsuiant = tempo ; 8
Kependant si on eut a]outer /JDE EDK/ dans la liste, on aimerait *u'il soit plac" au d"but de la liste.
Deenons aec la recherche de cette personne :
aant cestui (on ne troue pas) > >
9 9 9 liste MENJDN OJDK EIJK &K IJ& 2E $.Q6 mFtre $.66 mFtre $.AQ mFtre > A6. RHs 6Q.S RHs 6.B RHs ?@@ ?@@ ?@@
9
JDE EDK tempo .....mFtre .....RHs ?@@
Chapitre 9 : liste linaire chane (suite) page171
7/26/2019 chapitre9.doc
10/26
Ke *u'on eut est :
aant cestui (on ne troue pas) > >
9 9 9 liste MENJDN OJDK EIJK &K IJ& 2E L $.Q6 mFtre $.66 mFtre $.AQ mFtre > L VUU A6. RHs 6Q.S RHs 6.B RHs L L ?@@ ?@@ ?@@ L WUUUUUUUUUUUUUUUUUUUUUUUUUU L L L 9L WUUUUUUUUUUUUUU JDE EDK L tempo UU .....mFtre L .....RHs ?@@
l faut proHrammer comme suit : .....
if (aant == %&) 3 temposuiant = liste ; liste = tempo ; 8
D"sum" de la proHrammation :
...... obtenir([nouPers);
chercher(nouPers.nomPre, liste, [aant, [cestui);
if (cestui == %&) J]outer (nouPers, [liste, aant);
a fonction a]outer :
oid a]outer (personne nouPers, Pointeur P, Pointeur aant)
3 Pointeur tempo , liste = P ;
tempo = (Element ) malloc (si^eof(Element));
if (aant == %&) - a]outer au d"but de la liste -
3 temposuiant = liste ; liste = tempo ;
8
else - a]outer aprFs aant -
3 temposuiant = aantsuiant ; aantsuiant = tempo ; 8
P = liste ; 8
Chapitre 9 : liste linaire chane (suite) page172
7/26/2019 chapitre9.doc
11/26
$) %odification des informations d'un lment :
Kas $ :
a liste n'est pas tri"e ou la cl" n'est pas modifi"e.
chercher (cle, liste, [aant, [cestui);
demander([unePers); -- nouelles informations
cestuipers = unePers ;
Kas :
a liste est tri"e et la cl" est modifi"e :
chercher (cle, liste, [aant, [cestui);
- 2upprimer -
supprimer([liste, aant, cestui);
demander([unePers);
a]outer (unePers, [liste, aant);
&) Calcul des statistiues:
Eemple $ :
1crire une fonction et deu appels de cette fonction pour afficher \ l'"cran : la taille moGenne le poids moGen des personnes d'une liste lin"aire des personnes.
2olution :
float moGenne ( Pointeur liste, char codeIoulu ) 3 float somme = 0.0 ; int n = 0 ;
hile (liste)
3 n++ ; if (codeIoulu == '4') somme += listepers.taille ; else somme += listepers.poids ;
liste = listesuiant ; 8 return somme - n ; 8
Chapitre 9 : liste linaire chane (suite) page173
7/26/2019 chapitre9.doc
12/26
Jppels :
printf(/a taille moGenne : 5A.f mFtre7n/, moGenne(liste, '4')); printf(/e poids moGen : 5A.f RHs7n/, moGenne(liste, 'P'));
Eercice $ :
1crire une fonction et deu appels de cette fonction pour afficher \ l'"cran : la taille la plus Hrande et la taille la plus petite le poids le plus lourd et le poids le plus l"Her
) Autres gestions d'une liste linaire :
Eemple $ : cr"ation d'un fichier binaire :
1crire une fonction permettant de cr"er un fichier binaire des personnes \ partir d'une liste lin"aire des personnes.
2olution :
oid creer (char nomJKreer, Pointeur liste) 3 ZE aKreer = fopen(nomJKreer, /b/);
int nbctets = si^eof(personne);
hile (liste) 3 frite([(listepers), nbctets, $, aKreer); liste = listesuiant; 8 fclose(aKreer); 8
Jppel :
Kreer (/personne.Min/, liste);
Eercice $ :
1crire une fonction et appels de cette fonction pour :
cr"er un fichier binaire /DJ%NE.PED/ des personnes dont la taille est sup"rieur \ $.S6 mFtre ;
cr"er un fichier binaire /D2.PED/ des personnes dont le poids est sup"rieur \ $.B RHs ;
Chapitre 9 : liste linaire chane (suite) page174
7/26/2019 chapitre9.doc
13/26
Eercice :
1crire un proHramme permettant de H"rer une pile d'entiers. es actions pr"ues sont :
tester si une pile est ide ou non
fournir la aleur au sommet de la pile
a]outer un nouel entier au sommet de la pile
obtenir l'"l"ment au sommet de la pile
Eercice (un d"fi) :
ProHrammer le `uicR 2ort sans utiliser la r"cursiit".
) *+emple de r#ision de liste linaire chane :
n dispose du fichier des donn"es /Oetri*ue./ *ui contient les informations d'une personne par liHne : num"ro, see, taille et poids e fichier a "t" tri" selon le num"ro.
Eemple de donn"es :
$006 $.BQ B6.S$ Z $$0$ $.A A$. O
$$0 $.Q0 AB.SA O $$0B $.Q6 QA.0 O ... QA06 $.QS Q6.Q6 O QA0A $.A6 6C.SQ Z
1crire un proHramme *ui permet de cr"er une une liste cha#n"e dans l'ordre ZZ des personnes :
9 9 9 $006L L L $$0$ L L L QA0A L L 'Z' 'O' 'Z' liste $.BQ $.A ... $.A6 >
B6.S A$. 6C.C ?@@ ?@@ ?@@
e proHramme offre aussi un menu aec des options de Hestion d'une liste lin"aire (recherche, suppression, a]out, modification, etc...) et traite le choi de l'usaHer ]us*u'\ ce *ue l'usaHer d"cide de *uitter.
Chapitre 9 : liste linaire chane (suite) page175
7/26/2019 chapitre9.doc
14/26
2olution :
- 24E %EJDE KJ%EE : Zichier : 24E.JC6 -
include
7/26/2019 chapitre9.doc
15/26
oid afficher (personne unePers)
3 printf(/7n7n%um"ro : 5Ad7n/, unePers.numero); printf(/taille : 5A.f7n/, unePers.taille); printf(/poids : 5A.$f7n/, unePers.poids ); printf(/see : 5s7n/, toupper(unePers.see) == 'Z' /Z"minin/ : /Oasculin/) ; 8
oid demander ( personne ptr ) 3 personne unePers; printf(/Entre^ les informations de la personne : /); printf(/ %um"ro : /); scanf(/5d/, [(unePers.numero)); flushall(); printf(/ see : /); unePers.see = toupper(Hetche()); printf(/ taille : /);
scanf(/5f/, [(unePers.taille)); printf(/ poids : /); scanf(/5f/, [(unePers.poids)) ;
ptr = unePers; 8
oid lire (ZE donnees, personne P) - lire une liHne du fichier - 3char ]eter; float taille, poids ; fscanf(donnees,/5d5f5f5c5c5c7n/, [(Pnumero), [taille, [poids, []eter, []eter,[(Psee)); Ptaille = taille ; Ppoids = poids ; 8
oid isualiser ( pointeur liste) 3 const int parEcran = 0 ; - 0 personnes par "cran - int n ; char unKar ; - pour *uitter *uand l'usaHer le d"sire -
n = 0 ; unKar = ' ' ; - diff"rent \ '4' pour faire d"marrer la boucle - printf(/Nans l'ordre ZZ: 7n/); hile ( unKar != '4' [[ liste ) 3 n++;
printf(/5d) 56d 5A.f 5A.f5c7n/, n, (listepers).numero, (listepers).taille, (listepers).poids,(listepers).see); liste = listesuiant;
if ( n 5 parEcran == 0 LL liste == %&) 3 printf(/7n7n/); printf(/JppuGe^ sur Entr"e pour continuer ou 4 pour terminer /); fflush(stdin); unKar = toupper(Hetchar());
Chapitre 9 : liste linaire chane (suite) page177
7/26/2019 chapitre9.doc
16/26
if ( unKar != '4' [[ liste != %&) 3
printf(/Nans l'ordre ZZ: 7n/); 8 8 8 8
oid creerZZ (pointeur ) - dans l'ordre ZZ - - comme le fichier de donn"es a "t" tri" selon le num"ro de personnes, cette fagon de cr"ation permet d'obtenir une liste tri"e. - 3 ZE donnees ; personne unePers ; pointeur tempo, aliste, present ; char ]eter; int taillectets = si^eof(Element) ;
donnees = fopen(/Oetri*ue./,/r/);
if (feof(Nonnees)) aliste = %& ; else 3 - oici une ersion permettant la cr"ation dans l'ordre ZZ *ui fait pointer d'abord la t_te de liste au premier "l"ment et fait allonHer la liste aprFs. n "ite ainsi : le arninH (aertissement) du 4&DM K le test if (liste == %&) dans une boucle -
aliste = (pointeur) malloc (taillectets); lire(donnees, [unePers); laistepers = unePers; present = laiste;
hile (!feof(donnees)) 3 tempo = (pointeur) malloc (taillectets); lire(donnees, [unePers);
tempopers = unePers ; presentsuiant = tempo; present = tempo; 8 fclose(donnees); presentsuiant = %&; - mettre la fin de la liste, ici
en dehors de la boucle - 8 = laiste; 8
Chapitre 9 : liste linaire chane (suite) page178
7/26/2019 chapitre9.doc
17/26
oid inserer (pointeur P, personne unePers, pointeur aant) 3 pointeur tempo;
tempo = (pointeur) malloc(si^eof(Element)); tempopers = unePers ; if (aant == %&) 3 temposuiant = P ; (P) = tempo; 8 else 3 temposuiant = aantsuiant ; aantsuiant= tempo; 8 8
oid find (int aKhercher, pointeur liste, pointeur a, pointeur cl) - donne^ la aleur aKhercher, ]e cherche dans la liste et ous retourne deu pointeurs : $) cl *ui pointe ers rien si on ne le troue pas ers l'"l"ment on cherche si on le troue
) a *ui pointe ers "l"ment aGant la aleur *ui pr"cFde la aleur cherch"e. Ke pointeur est utile pour les tches de supprimer, a]outer, modifier
Eemple : si on cherche la personne aGant le num"ro $6Q, on aura : aant cestui L L L L 9 9 9 $006 $6Q 66B6 'Z' 'O' 'Z' liste $.A $.6S ... $.66 > 6A.6 A.6 B.Q ?@@ ?@@ ?@@ - 3 pointeur aant, cestui ; aant = %& ; cestui = liste ; hile ( cestui [[ (cestuipers).numero < aKhercher ) 3 aant = cestui; cestui = cestuisuiant ; 8 - si on ne le troue pas, on met le cestui \ %& - if (cestui [[ (cestuipers).numero != aKhercher) cestui = %&;
a = aant ; cl = cestui ; 8
Chapitre 9 : liste linaire chane (suite) page179
7/26/2019 chapitre9.doc
18/26
oid inerser ( pointeur ) 3 - J simuler pour mieu comprendre le principe -
pointeur aKontourner, le2uiant , liste = ;
aKontourner = liste ; liste = %& ;
hile (aKontourner) 3 le2uiant = aKontournersuiant ;
aKontournersuiant = liste ; liste = aKontourner ;
aKontourner = le2uiant; 8
= liste ; 8
oid chercher (pointeur liste) 3 pointeur cestui, aant ; int aKhercher; do 3
printf(/`uel*ues num"ros eistants : $006, $$0$, $Q0Q, Q$0B, Q60A7n/); printf(/`uel*ues num"ros ineistants : $SCC, , 6AQS7n/); printf(/Entre^ le num"ro de la personne \ chercher /); scanf(/5d/, [aKhercher); find (aKhercher,liste, [aant, [cestui);
if (cestui != %&) - on le troue - 3
printf(/7nj&P! on l'a trou" : 7n/); afficher(cestui pers); 8 else printf(/N"sol"! on ne troue pas cette personne7n/); - eemple /p"daHoHi*ue/ - if (aant == %&) printf(/aant aut %&7n/); else printf(/aleur aant : 56d7n/, aantpers.numero);
printf(/ae^ous une autre personne \ chercher (-%) /); fflush(stdin); 8
hile (toupper(Hetchar()) != '%'); 8
oid eliminer ( pointeur P, pointeur aant, pointeur cestui) 3 if (aant == %&) - au d"but de la liste - P = (P)suiant ; - on fait aancer la liste - else aantsuiant = cestuisuiant; 8
Chapitre 9 : liste linaire chane (suite) page180
7/26/2019 chapitre9.doc
19/26
oid supprimer (pointeur P) - 2i on eut supprimer $6Q : a) aec find .... aant cestui L L 9 9 9 $006 $6Q 66B6 'Z' 'O' 'Z' liste $.A $.6S ... $.66 > 6A.6 A.6 B.Q ?@@ ?@@ ?@@ a) n supprime : aant cestui 9 9 9 $006 $6Q $A6 'Z' 'O' 'O' liste $.A $.6S $.Q6 .... 6A.6 L A.6 C.Q
?@@ L ?@@ L ?@@ LL -
3 pointeur cestui, aant, tempo ; int a2upprimer; char reponse ; do 3
printf(/`uel*ues num"ros eistants : $006, $$0$, $Q0Q, Q$0B, Q60A 7n/); printf(/`uel*ues num"ros ineistants : $SCC, , 6AQS7n/); printf(/7n7nEntre^ le num"ro \ supprimer /); scanf(/5d/, [a2upprimer); find (a2upprimer,liste, [aant, [cestui); reponse = '%'; if (cestui != %&) 3 printf(/n l'a trou" : 7n/); afficher(cestuipers); printf(/Konfirme^ous la suppression (-%) /); fflush(stdin); reponse = toupper(Hetche());
if (reponse == '') eliminer ( P, aant, cestui); 8 else printf(/N"sol"! on ne troue pas cette personne7n/);
printf(/ae^ous autre personne \ supprimer (-%) /); fflush(stdin);
8 hile (toupper(Hetche()) != '%'); 8
Chapitre 9 : liste linaire chane (suite) page181
7/26/2019 chapitre9.doc
20/26
oid a]outer (pointeur P) - 2upposons *u'on euille a]outer une personne de num"ro $$00 a) aec find .... on ne le troue pas mais aant pointe sur l'"l"ment aGant le num"ro $006 9 aant cestui > L ?@ 9 9 9 $006 $6Q 66B6 'Z' 'O' 'Z' liste $.A $.6S ... $.66 > 6A.6 A.6 B.Q ?@@ ?@@ ?@@ b) on a]oute : aant 9 9 $006 $6Q 'Z' 'O'
liste $.A $.6S ... 6A.6 L L A.6 ?@@ L L ?@@ L 9 L $$00 L tempo .... .... ?@@ -
3 pointeur cestui, aant, tempo ; int aJ]outer; char reponse ; personne unePers ; float , G; clrscr(); Nemander([unePers); Zind (unePers.numero,liste, [aant, [cestui); reponse = '%'; if (cestui != %&) 3 printf(/n l'a trou" : 7n/); Jfficher(cestuipers); printf(/Konfirme^ous l'a]out de la nouelle personne (-%) /); reponse = toupper(Hetche()); 8 if (reponse == '' LL cestui == %&)
nserer (P, unePers, aant); 8
Chapitre 9 : liste linaire chane (suite) page182
7/26/2019 chapitre9.doc
21/26
oid Oodifier (pointeur P) 3 pointeur cestui, aant, tempo ; int aOodifier; char reponse ; personne nouPers ; do 3
printf(/`uel*ues num"ros eistants : $006, $$0$, $Q0Q, Q$0B, Q60A 7n/); printf(/`uel*ues num"ros ineistants : $SCC, , 6AQS7n/); printf(/Entre^ le num"ro de la personne \ modifier ses informations /); scanf(/5d/, [aOodifier); find (aOodifier, P, [aant, [cestui ); reponse = '%'; if (cestui != %&) 3 printf(/n l'a trou" : 7n/); afficher(cestuipers); printf(/7n7n/); printf(/N"sire^ous modifier les informations de cette personne (-%)/); fflush(stdin);
reponse = toupper(Hetchar()); if (reponse == '') 3 demander( [nouPers); if ( nouPers.numero == (cestuipers).numero ) cestuipers = nouPers; else 3 eliminer ( P, aant, cestui); find ( nouPers.numero, P, [aant, [cestui); inserer(P, nouPers, aant); 8 8 8 else printf(/N"sol"! on ne troue pas cette personne7n/); printf(/ae^ous autre personne \ modifier (-%) /); fflush(stdin); 8 hile (toupper(Hetche()) != '%'); 8
oid traiter ( char choi, pointeur ) - N"pendant du choi, il est possible *ue la liste sera modifi"e. Par cette raison, le passaHe de la liste est par pointeur. - 3 sitch(choi)
3 case 'I' : isualiser( ); breaR; case 'K' : chercher ( ); breaR ; case '2' : supprimer (); breaR; case 'J' : a]outer (); breaR; case 'O' : modifier(); breaR;
Chapitre 9 : liste linaire chane (suite) page183
7/26/2019 chapitre9.doc
22/26
case '' : inerser(); - inerser la liste - isualiser(); inerser(); - remettre dans l'ordre ZZ - breaR; 8 8
oid main() 3 char choi ; - option d'un menu -
creerZZ ([liste); do 3 obtenir([choi); - choi d'une option du menu - traiter(choi, [liste) ; - traiter le choi aec la liste - 8 hile (choi != '`'); 8
E"cution :
4ape^ : ` pour `uitter I pour Iisualiser K pour Khercher J pour J]outer une nouelle personne O pour Oodifier les informations d'une personne 2 pour 2upprimer une personne de la liste pour isualiser la liste nerse
Entre^ otre choi parmi `, I, K, J, O, 2 ou I
Nans l'ordre ZZ: $) $006 $.BQ B6.S$ Z ) $$0$ $.A A$. O ) $$0 $.Q0 AB.SA O B) $$0B $.Q6 QA.0 O 6) $$0Q $.AS 6Q.A$ Z A) $B06 $.66 66.B Z Q) $B0A $.6 BB.C$ Z S) $B0Q $.6Q 6$.Q$ Z C) $60 $.AS AB.B$ Z $0) $60B $.6Q 60.S0 Z
$$) $60A $.Q AA. Z $) $Q0Q $.A6 6S.6$ Z $) $S0A $.QS A6. O $B) $S0Q $.A A0. Z $6) $C0$ $.6Q 6A.6 O $A) $C0 $.Q Q$.AQ O $Q) $C06 $.S0 S.$0 O $S) Q$0 $.Q A.06 Z $C) Q$0 $.QS Q6.Q6 O 0) Q$0B $.QS QB.SB O
Chapitre 9 : liste linaire chane (suite) page184
7/26/2019 chapitre9.doc
23/26
JppuGe^ sur Entr"e pour continuer ou 4 pour terminer 4
4ape^ : ` pour `uitter I pour Iisualiser K pour Khercher J pour J]outer une nouelle personne O pour Oodifier les informations d'une personne 2 pour 2upprimer une personne de la liste pour isualiser la liste nerse
Entre^ otre choi parmi `, I, K, J, O, 2 ou K `uel*ues num"ros eistants : $006, $$0$, $Q0Q, Q$0B, Q60A `uel*ues num"ros ineistants : $SCC, , 6AQS Entre^ le num"ro de la personne \ chercher $Q0Q
j&P! on l'a trou" :
%um"ro : $Q0Q taille : $.A6 poids : 6S.6 see : Z"minin aleur aant : $60A
ae^ous une autre personne \ chercher (-%) %
4ape^ : ` pour `uitter I pour Iisualiser K pour Khercher J pour J]outer une nouelle personne O pour Oodifier les informations d'une personne 2 pour 2upprimer une personne de la liste pour isualiser la liste nerse
Entre^ otre choi parmi `, I, K, J, O, 2 ou 2 `uel*ues num"ros eistants : $006, $$0$, $Q0Q, Q$0B, Q60A `uel*ues num"ros ineistants : $SCC, , 6AQS
Entre^ le num"ro \ supprimer $$0$
n l'a trou" :
%um"ro : $$0$ taille : $.A poids : A$. see : Oasculin Konfirme^ous la suppression (-%)
Chapitre 9 : liste linaire chane (suite) page185
7/26/2019 chapitre9.doc
24/26
ae^ous autre personne \ supprimer (-%) o
`uel*ues num"ros eistants : $006, $$0$, $Q0Q, Q$0B, Q60A `uel*ues num"ros ineistants : $SCC, , 6AQS
Entre^ le num"ro \ supprimer Q$0B
n l'a trou" :
%um"ro : Q$0B taille : $.QS poids : QB.S see : Oasculin Konfirme^ous la suppression (-%) o
ae^ous autre personne \ supprimer (-%) o
`uel*ues num"ros eistants : $006, $$0$, $Q0Q, Q$0B, Q60A `uel*ues num"ros ineistants : $SCC, , 6AQS
Entre^ le num"ro \ supprimer QA0A
n l'a trou" :
%um"ro : QA0A taille : $.A6 poids : 6C.C see : Z"minin Konfirme^ous la suppression (-%) o
ae^ous autre personne \ supprimer (-%) n
4ape^ : ` pour `uitter I pour Iisualiser K pour Khercher J pour J]outer une nouelle personne O pour Oodifier les informations d'une personne 2 pour 2upprimer une personne de la liste pour isualiser la liste nerse
Entre^ otre choi parmi `, I, K, J, O, 2 ou O `uel*ues num"ros eistants : $006, $$0$, $Q0Q, Q$0B, Q60A `uel*ues num"ros ineistants : $SCC, , 6AQS
Entre^ le num"ro de la personne \ modifier ses informations $006
n l'a trou" :
%um"ro : $006 taille : $.BQ poids : B6.S see : Z"minin
Chapitre 9 : liste linaire chane (suite) page186
7/26/2019 chapitre9.doc
25/26
N"sire^ous modifier les informations de cette personne (-%) o
Entre^ les informations de la personne :
%um"ro : $006 see : f taille : $.AQ poids : BS.6
ae^ous autre personne \ modifier (-%) o
`uel*ues num"ros eistants : $006, $$0$, $Q0Q, Q$0B, Q60A `uel*ues num"ros ineistants : $SCC, , 6AQS
Entre^ le num"ro de la personne \ modifier ses informations Q$0B
N"sol"! on ne troue pas cette personne
ae^ous autre personne \ modifier (-%) n
4ape^ : ` pour `uitter I pour Iisualiser K pour Khercher J pour J]outer une nouelle personne O pour Oodifier les informations d'une personne 2 pour 2upprimer une personne de la liste pour isualiser la liste nerse
Entre^ otre choi parmi `, I, K, J, O, 2 ou J
Entre^ les informations de la personne :
%um"ro : B6 see : m taille : $.AQ poids : AQ.S
4ape^ : ` pour `uitter I pour Iisualiser K pour Khercher J pour J]outer une nouelle personne
O pour Oodifier les informations d'une personne 2 pour 2upprimer une personne de la liste pour isualiser la liste nerse
Entre^ otre choi parmi `, I, K, J, O, 2 ou
Nans l'ordre ZZ: $) QA06 $.QS Q6.Q6 O ) QA0B $.B6 B0.Q Z
Chapitre 9 : liste linaire chane (suite) page187
7/26/2019 chapitre9.doc
26/26
) QA0 $.A0 BS.CC Z B) QA0 $.A6 6.0Q Z 6) QA0$ $.A BQ.A Z A) Q60Q $.Q Q.6Q O Q) Q60A $.AS 6B.B Z S) Q606 $.Q A6. O C) Q60 $.Q0 A0.QS Z $0) Q60$ $.A6 A$.AC O $$) QB0Q $.Q6 Q$.AQ O $) QB06 $.Q0 A.60 Z $) QB0B $.S SA.$S O $B) QB0 $.S0 QC.S O $6) QB0 $.A 6.6 Z $A) QB0$ $.A 6B.SS Z $Q) Q0Q $.Q0 6A.6 Z $S) Q06 $.S0 SC.A O $C) Q0B $.A6 AB.B$ O 0) Q0 $.Q6 A.CA Z
JppuGe^ sur Entr"e pour continuer ou 4 pour terminer 4
4ape^ : ` pour `uitter I pour Iisualiser K pour Khercher J pour J]outer une nouelle personne O pour Oodifier les informations d'une personne 2 pour 2upprimer une personne de la liste pour isualiser la liste nerse
Entre^ otre choi parmi `, I, K, J, O, 2 ou `