chapitre9.doc

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 `