You are on page 1of 14

Sauf mention contraire, le contenu de cet ouvrage est publi sous la licence : Creative Commons BY-NC-SA 2.

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/

Simple IT 2010 - ISBN : 978-2-9535278-0-3

Chapitre

29
Dicult :

Les listes chanes

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

CHAPITRE 29. LES LISTES CHANES

Reprsentation d'une liste chane


u9estEe qu9une liste hne c te vous propose de prtir sur le modle des tleuxF n tleu peut tre reprsent en mmoire omme sur l (gF PWFIF sl s9git ii d9un tleu ontennt des intF
1

Figure PWFI ! n tleu de R ses en mmoire @reprsenttion horizontleA

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

Figure PWFP ! yn ne peut ps grndir un tleu prs s rtion

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

CONSTRUCTION D'UNE LISTE CHANE

Figure PWFR ! ghque lment ontient une donne @exF X un intA et un pointeur vers l9lment suivnt

Construction d'une liste chane


ssons mintennt u onretF xous llons essyer de rer une struture qui fonE tionne sur le prinipe que nous venons de douvrir F
2

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

CHAPITRE 29. LES LISTES CHANES

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

Le dernier lment de la liste


xotre shm est presque ompletF sl mnque une dernire hose X on imerit retenir le dernier lment de l listeF in e'etD il fudr ien rrter de prourir l liste un moment donnF eve quoi pourritEon signi(er notre progrmme  topD ei est le dernier lment c sl serit possile d9jouter dns l struture viste un pointeur vers le dernier ilementF outefoisD il y enore plus simple X il su0t de fire pointer le dernier lment de l liste vers xvvD 9estEEdire de mettre son pointeur suivnt xvvF gel nous permet de rliser un shm en(n omplet de notre struture de liste hne @(gF PWFTAF
5. En revanche, il ne sait pas quel est l'lment prcdent, il est donc impossible de revenir en arrire partir d'un lment avec ce type de liste. On parle de liste  simplement chane , alors que les listes  doublement chanes  ont des pointeurs dans les deux sens et n'ont pas ce dfaut. Elles sont nanmoins plus complexes.

RVH

CONSTRUCTION D'UNE LISTE CHANE

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

CHAPITRE 29. LES LISTES CHANES

Les fonctions de gestion de la liste


xous vons r deux strutures qui permettent de grer une liste hne X ! ilementD qui orrespond un lment de l liste et que l9on peut dupliquer utnt de fois que nessire Y ! visteD qui ontrle l9ensemle de l listeF xous n9en urons esoin qu9en un seul exemplireF g9est ienD mis il mnque enore l9essentiel X les fontions qui vont mnipuler l liste hneF in e'etD on ne v ps modi(er  l min le ontenu des strutures hque fois qu9on en esoin 3 sl est plus sge et plus propre de psser pr des fontions qui utomtisent le trvilF inore futEil les rerF premire vueD je diris qu9on ur esoin de fontions pour X ! initiliser l liste Y ! jouter un lment Y ! supprimer un lment Y ! 0her le ontenu de l liste Y ! supprimer l liste entireF yn pourrit rer d9utres fontions @pr exemple pour luler l tille de l listeA mis elles sont moins indispenslesF xous llons ii nous onentrer sur elles que je viens de vous numrerD e qui nous fer dj une onne seF te vous inviteri ensuite rliser d9utres fontions pour vous entrner une fois que vous urez ien ompris le prinipeF

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

LES FONCTIONS DE GESTION DE LA LISTE


return listeY

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

Figure PWFU ! v9tt de l liste qui vient d9tre initilise

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

CHAPITRE 29. LES LISTES CHANES

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

Figure PWFV ! yn souhite insrer notre nouvel lment en dut de liste

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

LES FONCTIONS DE GESTION DE LA LISTE

PF fire pointer le pointeur premier vers notre nouvel lmentF


On ne peut pas suivre ces tapes dans l'ordre inverse ! En eet, si vous faites d'abord pointer premier vers notre nouvel lment, vous perdez l'adresse du premier lment de la liste ! Faites le test, vous comprendrez de suite pourquoi l'inverse est impossible.

gel ur pour e'et d9insrer orretement notre nouvel lment dns l liste hne @(gF PWFWA 3

Figure PWFW ! snsertion d9un lment dns l liste hne

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

CHAPITRE 29. LES LISTES CHANES

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

Figure PWFIH ! uppression d9un lment de l liste hne

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

Acher la liste chane


our ien visuliser e que ontient notre liste hneD une fontion d90hge serit idle 3 sl su0t de prtir du premier lment et d90her hque lment un un en  sutnt de lo en loF
void ffiherviste@viste BlisteA { if @liste aa xvvA { exit@ispesviAY } ilement Btuel a listeEbpremierY while @tuel 3a xvvA {

RVT

ALLER PLUS LOIN


printf@47d Eb 4D tuelEbnomreAY tuel a tuelEbsuivntY

} 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

Aller plus loin


xous venons de fire le tour des priniples fontions nessires l gestion d9une liste hne X initilistionD jout d9lmentD suppression d9lmentD etF oii quelques utres fontions qui mnquent et que je vous invite rireD e ser un trs on exerie 3 ! Insertion d'un lment en milieu de liste X tuellementD nous ne pouvons jouter des lments qu9u dut de l listeD e qui est gnrlement su0sntF i toutefois on veut pouvoir jouter un lment u milieuD il fut rer une fontion spi(que qui prend un prmtre supplmentire X l9dresse de elui qui prder notre nouvel lment dns l listeF otre fontion v prourir l liste hne jusqu9 tomer sur l9lment indiquF ille y insrer le petit nouveu juste prsF ! Suppression d'un lment en milieu de liste X le prinipe est le mme que pour l9insertion en milieu de listeF gette foisD vous devez jouter en prmtre l9dresse de l9lment supprimerF RVU

CHAPITRE 29. LES LISTES CHANES

! 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

You might also like