Professional Documents
Culture Documents
0 La copie de cet ouvrage est autorise sous rserve du respect des conditions de la licence Texte complet de la licence disponible sur :
http://creativecommons.org/licenses/by-nc-sa/2.0/fr/
Chapitre
29
Dicult :
our stocker des donnes en mmoire, nous avons utilis des variables simples (type int, doule. . .), des tableaux et des structures personnalises. Si vous souhaitez stocker une srie de donnes, le plus simple est en gnral d'utiliser des tableaux. Toutefois, les tableaux se rvlent parfois assez limits. Par exemple, si vous crez un tableau de 10 cases et que vous vous rendez compte plus tard dans votre programme que vous avez besoin de plus d'espace, il sera impossible d'agrandir ce tableau. De mme, il n'est pas possible d'insrer une case au milieu du tableau. Les listes chanes reprsentent une faon d'organiser les donnes en mmoire de manire beaucoup plus exible. Comme la base le langage C ne propose pas ce systme de stockage, nous allons devoir le crer nous-mmes de toutes pices. C'est un excellent exercice qui vous aidera tre plus l'aise avec le langage.
RUU
gomme je vous le disis en introdutionD le prolme des tleux est qu9ils sont (gsF sl n9est ps possile de les grndirD moins d9en rer de nouveuxD plus grnds @(gF PWFPAF he mmeD il n9est ps possile d9y insrer une se u milieuD moins de dler tous les utres lmentsF
ve lngge g ne propose ps d9utre systme de stokge de donnesD mis il est possile de le rer soiEmme de toutes piesF inore futEil svoir omment s9y prendre X 9est justement e que e hpitre et les suivnts vous proposent de douvrirF ne liste hne est un moyen d9orgniser une srie de donnes en mmoireF gel onsiste ssemler des strutures en les lint entre elles l9ide de pointeursF yn pourrit les reprsenter omme ei X
Figure PWFQ ! ne liste hne est un ssemlge de strutures lies pr des pointeurs
ghque lment peut ontenir e que l9on veut X un ou plusieurs intD douleF F F in plus de elD hque lment possde un pointeur vers l9lment suivnt @(gF PWFRAF te reonnis que tout el est enore trs thorique et doit vous prtre un peu )ou pour le momentF etenez simplement omment les lments sont gens entre eux X ils forment une chane de pointeursD d9o le nom de liste hne F
Contrairement aux tableaux, les lments d'une liste chane ne sont pas placs cte cte dans la mmoire. Chaque case pointe vers une autre case en mmoire qui n'est pas ncessairement stocke juste ct.
1. J'ai choisi ici de reprsenter le tableau horizontalement, mais il serait aussi possible de le prsenter verticalement, peu importe.
RUV
Figure PWFR ! ghque lment ontient une donne @exF X un intA et un pointeur vers l9lment suivnt
Un lment de la liste
our nos exemplesD nous llons rer une liste hne de nomres entiers F ghque lment de l liste ur l forme de l struture suivnte X
3
typedef strut ilement ilementY strut ilement { int nomreY ilement BsuivntY }Y
xous vons r ii un lment d9une liste hneD orrespondnt l (gF PWFR que nous vons vue plus ttF ue ontient ette struture c ! ne donneD ii un nomre de type int X on pourrit rempler el pr n9importe quelle utre donne @un douleD un tleuF F FAF gel orrespond e que vous voulez stokerD 9est vous de l9dpter en fontion des esoins de votre progrmme F ! n pointeur vers un lment du mme type ppel suivntF g9est e qui permet de lier les lments les uns ux utres X hque lment sit o se trouve l9lment
4
2. Je rappelle que tout ce que nous allons faire ici fait appel des techniques du langage C que vous connaissez dj. Il n'y a aucun lment nouveau, nous allons nous contenter de crer nos propres structures et fonctions et les transformer en un systme logique, capable de se rguler tout seul. 3. On pourrait aussi bien crer une liste chane contenant des nombres dcimaux ou mme des tableaux et des structures. Le principe des listes chanes s'adapte n'importe quel type de donnes, mais ici, je propose de faire simple pour que vous compreniez bien le principe. ;-) 4. Si on veut travailler de manire gnrique, l'idal est de faire un pointeur sur void : void*. Cela permet de faire pointer vers n'importe quel type de donnes.
RUW
suivnt en mmoire F gomme je vous le disis plus ttD les ses ne sont ps te te en mmoireF g9est l grosse di'rene pr rpport ux tleuxF gel o're dvntge de souplesse r on peut plus filement jouter de nouvelles ses pr l suite u esoinF
5
La structure de contrle
in plus de l struture qu9on vient de rer @que l9on dupliquer utnt de fois qu9il y d9lmentsAD nous llons voir esoin d9une utre struture pour ontrler l9ensemle de l liste hneF ille ur l forme suivnte X
typedef strut viste visteY strut viste { ilement BpremierY }Y
gette struture viste ontient un pointeur vers le premier lment de l listeF in e'etD il fut onserver l9dresse du premier lment pour svoir o ommene l listeF i on onnt le premier lmentD on peut retrouver tous les utres en sutnt d9lment en lment l9ide des pointeurs suivntF
Une structure compose d'une seule sous-variable n'est en gnral pas trs utile. Nanmoins, je pense que l'on aura besoin d'y ajouter des sous-variables plus tard, je prfre donc prendre les devants en crant ici une structure. On pourrait par exemple y stocker en plus la taille de la liste, c'est--dire le nombre d'lments qu'elle contient.
xous n9urons esoin de rer qu9un seul exemplire de l struture visteF ille permet de ontrler toute l liste @(gF PWFSAF
RVH
Figure PWFS ! v struture viste nous donne des informtions sur l9ensemle de l
liste hne
Figure PWFT ! ve dernier lment de l liste pointe vers xvv pour indiquer l (n de
liste
RVI
Initialiser la liste
v fontion d9initilistion est l toute premire que l9on doit ppelerF ille re l struture de ontrle et le premier lment de l listeF te vous propose l fontion iEdessousD que nous ommenterons juste prsD ien enE tendu X
viste Binitilistion@A { viste Bliste a mllo@sizeof@BlisteAAY ilement Belement a mllo@sizeof@BelementAAY if @liste aa xvv || element aa xvvA { exit@ispesviAY } elementEbnomre a HY elementEbsuivnt a xvvY listeEbpremier a elementY
RVP
yn ommene pr rer l struture de ontrle liste F yn l9lloue dynmiquement ve un mlloF v tille llouer est lule utomtiquement ve sizeof@BlisteAF v9ordinteur sur qu9il doit llouer l9espe nessire u stokge de l struture viste F yn lloue ensuite de l mme mnire l mmoire nessire u stokge du premier lmentF yn vri(e si les llotions dynmiques ont fontionnF in s d9erreurD on rrte immditement le progrmme en fisnt ppel exit@AF i tout s9est ien pssD on d(nit les vleurs de notre premier lment X ! l donne nomre est mise H pr dfut Y ! le pointeur suivnt pointe vers xvv r le premier lment de notre liste est ussi le dernier pour le momentF gomme on l9 vu plus ttD le dernier lment doit pointer vers xvv pour signler qu9il est en (n de listeF xous vons don mintennt russi rer en mmoire une liste ompose d9un seul lment et ynt une forme semlle l (gF PWFUF
6 7
Ajouter un lment
siD les hoses se ompliquent un peuF y vEtEon jouter un nouvel lment c eu dut de l listeD l (nD u milieu c v rponse est qu9on le hoixF vire nous de dider e que nous fisonsF our e hpitreD je propose que l9on voie ensemle l9jout d9un lment en dut de listeF h9une prtD 9est simple omprendreD et d9utre prt el me donner une osion l (n de e hpitre de vous proposer de r)hir l rtion d9une fontion qui joute un lment un endroit pris de l listeF xous devons rer une fontion ple d9insrer un nouvel lment en dut de listeF
6. Notez que le type de donnes est Liste et que la variable s'appelle liste. La majuscule permet de les direncier. 7. On aurait aussi pu crire sizeof(Liste), mais si plus tard on dcide de modier le type du pointeur liste, on devra aussi adapter le sizeof.
RVQ
our nous mettre en situtionD imginons un s semlle l (gF PWFV X l liste est ompose de trois lments et on souhite en jouter un nouveu u dutF
sl v flloir dpter le pointeur premier de l liste insi que le pointeur suivnt de notre nouvel lment pour insrer orretement eluiEi dns l listeF te vous propose pour el e ode soure que nous nlyserons juste prs X
void insertion@viste BlisteD int nvxomreA { GB grtion du nouvel lment BG ilement Bnouveu a mllo@sizeof@BnouveuAAY if @liste aa xvv || nouveu aa xvvA { exit@ispesviAY } nouveuEbnomre a nvxomreY GB snsertion de l9lment u dut de l liste BG nouveuEbsuivnt a listeEbpremierY listeEbpremier a nouveuY
v fontion insertion@A prend en prmtre l9lment de ontrle liste @qui ontient l9dresse du premier lmentA et le nomre stoker dns le nouvel lment que l9on v rerF hns un premier tempsD on lloue l9espe nessire u stokge du nouvel lment et on y ple le nouveu nomre nvxomreF sl reste lors une tpe dlite X l9insertion du nouvel lment dns l liste hneF xous vons ii hoisi pour simpli(er d9insrer l9lment en dut de listeF our mettre jour orretement les pointeursD nous devons proder dns et ordre pris X IF fire pointer notre nouvel lment vers son futur suesseurD qui est l9tuel preE mier lment de l liste Y RVR
gel ur pour e'et d9insrer orretement notre nouvel lment dns l liste hne @(gF PWFWA 3
Supprimer un lment
he mme que pour l9insertionD nous llons ii nous onentrer sur l suppression du premier lment de l listeF sl est tehniquement possile de supprimer un lment pris u milieu de l listeD e ser d9illeurs un des exeries que je vous proposeri l (nF v suppression ne pose ps de di0ult supplmentireF sl fut ependnt ien dpter les pointeurs de l liste dns le on ordre pour ne perdre uune informtionF
void suppression@viste BlisteA { if @liste aa xvvA { exit@ispesviAY } if @listeEbpremier 3a xvvA { ilement Bupprimer a listeEbpremierY listeEbpremier a listeEbpremierEbsuivntY free@upprimerAY }
RVS
yn ommene pr vri(er que le pointeur qu9on nous envoie n9est ps xvvD sinon on ne peut ps trvillerF yn vri(e ensuite qu9il y u moins un lment dns l listeD sinon il n9y rien fireF ges vri(tions e'etuesD on peut suvegrder l9dresse de l9lment supprimer dns un pointeur upprimerF yn dpte ensuite le pointeur premier vers le nouveu premier lmentD qui est tuellement en seonde position de l liste hneF sl ne reste plus qu9 supprimer l9lment orrespondnt notre pointeur upprimer ve un free @(gF PWFIHAF
gette fontion est ourte mis suriezEvous l rrire c sl fut ien omprendre qu9on doit fire les hoses dns un ordre pris X IF fire pointer premier vers le seond lment Y PF supprimer le premier lment ve un freeF i on fisit l9inverseD on perdrit l9dresse du seond lment 3
RVT
} printf@4xvvn4AY
gette fontion est simple X on prt du premier lment et on 0he le ontenu de hque lment de l liste @un nomreAF yn se sert du pointeur suivnt pour psser l9lment qui suit hque foisF yn peut s9muser tester l rtion de notre liste hne et son 0hge ve un min X
int min@A { viste Bmviste a initilistion@AY insertion@mvisteD RAY insertion@mvisteD VAY insertion@mvisteD ISAY suppression@mvisteAY ffiherviste@mvisteAY } return HY
in plus du premier lment @que l9on liss ii HAD on en joute trois nouveux ette listeF uis on en supprime unF eu (nlD le ontenu de l liste hne ser don X
V Eb R Eb H Eb xvv
! Destruction de la liste X il su0t de supprimer tous les lments un un 3 ! Taille de la liste X ette fontion indique omien il y d9lments dns votre liste hneF v9idlD plutt que d9voir luler ette vleur hque foisD serit de mintenir jour un entier nilements dns l struture visteF sl su0t d9inrmenter e nomre hque fois qu9on joute un lment et de le drmenter qund on en supprime unF te vous onseille de regrouper toutes les fontions de gestion de l liste hne dns des (hiers listehineeF et listehineeFh pr exempleF ge ser votre premire iliothque 3 ous pourrez l rutiliser dns tous les progrmmes dns lesquels vous vez esoin de listes hnesF ous pouvez tlhrger le projet des listes hnes omprennt les fontions que nous vons douvertes ensemleF gel vous fer une onne se de dprtF gode we X THQUIT
En rsum
! ves listes hnes onstituent un nouveu moyen de stoker des donnes en mmoireF illes sont plus )exiles que les tleux r on peut jouter et supprimer des ses n9importe quel momentF ! sl n9existe ps en lngge g de systme de gestion de listes hnesD il fut l9rire nousEmmes 3 g9est un exellent moyen de progresser en lgorithmique et en proE grmmtion en gnrlF ! hns une liste hneD hque lment est une struture qui ontient l9dresse de l9lment suivntF ! sl est onseill de rer une struture de ontrle @du type viste dns notre sA qui retient l9dresse du premier lmentF ! sl existe une version mliore " mis plus omplexe " des listes hnes ppeE le listes doulement hnes D dns lesquelles hque lment possde en plus l9dresse de elui qui le prdeF
RVV