Les Listes Chaines 1. Introduction Jusqu maintenant, nous avons vu la reprsentation des donnes sous orme !onti"#e $!ons!utive ou squentielle% & !'est--dire en utilisant des ta(leau). *ette reprsentation est tr+s adquate pour les oprations implmentes , -ossi(ilit da!!+s un lment quel!onque. -ar!ours de la liste $dans un sens ou dans lautre%. .nsertion et suppression au) e)trmits de la liste. *ependant, dans la reprsentation !onti"#e, les oprations dinsertion et de suppression une position quel!onque de la liste sont !o/teuses $ !ause des d!ala"es%, surtout si elles sont rquentes. 0)emple , *onsidrons la liste suivante des mots du di!tionnaire an"lais !omposs de 1 lettres et qui se terminent ar 2A3. 45$6A3, *A3, 0A3, FA3, HA3, 4A3, 7A3%. 4a liste 4 est trie par ordre alp8a(tique $!roissant%. .l est vident que !ette liste nest pas !ompl+te. 9ous pouvons !onstater , :uun autre mot peut ;tre a<out la liste, par e)emple le mot = >A3 ?. :uun des mem(res de la liste peut ;tre supprim, par e)emple le mot = 0A3 ? peut ;tre supprim si nous nous intressons une liste !ompose uniquement de noms $0A3 est un ver(e%. Supposons que la liste 4 est reprsente par un ta(leau , 4insertion du mot = >A3 ? dans la liste n!essite le d!ala"e dune partie de la liste $HA3, 4A3, 7A3% pour o(tenir la nouvelle liste 45$6A3, *A3, 0A3, FA3, >A3, HA3, 4A3, 7A3%. 4a suppression du mot = 0A3 ? n!essite le d!ala"e dune partie de la liste $FA3, HA3, 4A3, 7A3%. 9ous savons que !es d!ala"es sont indsira(les, en parti!ulier pour , Des listes volumineuses. Des listes dans lesquelles les insertions et les suppressions sont tr+s rquentes. @ne solution possi(le serait , 4a reprsentation p8Asique $en mmoire% ne respe!te pas or!ment lordre des lments dans la liste. Bn asso!ie !8aque lment de la liste une rren!e $un lien% vers llment suivant pour re!onstituer lordre initial $ordre alp8a(tique%. 4e par!ours de la liste $en respe!tant lordre% ne !onsistera plus par!ourir dans lordre de reprsentation $!e qui est tou<ours le !as dans un ta(leau% mais en suivant les liens $le !8aina"e%. 2. Utilisation des pointeurs pour le chanage dune liste *8aque lment de la liste sera reprsent par une stru!ture $un maillon% !ontenant , 4a valeur $ou les valeurs% de llment en question @n pointeur vers la stru!ture qui !ontient le pro!8ain lment de la liste -our pouvoir manipuler la liste nous avons (esoin uniquement de !onnaitre ladresse du premier maillon de la liste. *ette adresse sera !onserve dans une varia(le = F ? $pointeur de t;te de liste%. 1 F.Henni ASD1 2011-2012 4e dernier maillon ne doit pointer sur au!un autre maillon. -our !ela la valeur sp!iale 9@44 est utilise pour marquer la in de la liste. S!8matiquement notre liste pourrait ;tre reprsente !omme suit , 4insertion dun nouvel lment dans la liste peut se aire suivant le s!8ma suivant , 0t la suppression dun lment $par e)emple = 0A3 ?% suivant le s!8ma , a) Dclarations 4es d!larations $en lan"a"e *% qui !orrespondent la reprsentation propose sont $si nous !onsidrons le)emple de liste de mots 1 lettres% , struct node { char word[4]; struct node* next; }; 4e tApe = struct node ? !orrespond au) nCuds qui !omposent notre liste. .l permet de d!larer des varia(les de tApe stru!ture ou pointeurs sur !ette stru!ture. -ar e)emple , struct node unNoeud ; /* variable de type structure */ struct node *ptrNoeud /* variable de type pointeur sur struct node */ *ette d!laration peut ;tre amliore en utilisant une dinition de tApe $tApede% , typedef struct Node *nodePointer ; /* type dun pointeur vers un nud de la liste */ struct Node { char value[4] ; nodePointer next ; }; 4intr;t de !ette derni+re version est quelle permet de d!larer le tApe = nodePointer ? qui servira d!larer un pointeur sur un nCud !omme suit , nodePointer p1 p! ; 2
"#$ %#$ &#$ '#$ (#$ )#$ *#$ '
"#$ %#$ &#$ '#$ (#$ )#$ *#$ ' +#$
"#$ %#$ &#$ '#$ (#$ )#$ *#$ ' F.Henni ASD1 2011-2012 p1 et p2 sont des varia(les de tApe pointeurs. 0lles doivent don! ;tre initialises !orre!tement avant d;tre utilises. *8a!une de !es varia(le doit !ontenir ladresse dune stru!ture = 9ode ? ou (ien la valeur sp!iale = 9@44 ?. b) Cration dynamique des nuds 4es nCuds dune liste !8aDne seront !rs pendant le)!ution, !est !e quon appelle une !ration dAnamique. -our !ela il aut , D!larer une varia(le de tApe = pointeur sur nCud ? pour !ontenir ladresse du nCud !rer. Appeler une on!tion dallo!ation de mmoire pour rserver un espa!e mmoire !orrespondant la taille dun nCud. *ette on!tion retourne ladresse de lespa!e allou. *e "enre dallo!ation sappelle une allo!ation dAnamique, par opposition lallo!ation statique pour les varia(les ordinaires $autres que les pointeurs%. 4es instru!tions * qui ralisent !ette a!tion sont , nodePointer p ; /* dclaration dune variable p de type pointeur sur nud */ ,,,,,,-- p . /nodePointer01alloc /si2eof/struct Node00 ; EEEEEE.. *ommentaires, 4a on!tion = mallo! ? est lune des on!tions dallo!ation de mmoire du lan"a"e *. Son prototApe se trouve dans le i!8ier dent;te = stdli(.8 ?. 4e param+tre de la on!tion = mallo! ? doit ;tre de tApe entier $unsi"ned%. *e param+tre indique le nom(re do!tets de mmoire allouer. Si lallo!ation de mmoire !8oue, la on!tion = mallo! ? retourne la valeur = 9@44 ?. Si lallo!ation de mmoire russit, la on!tion = mallo! ? retourne un pointeur vers lespa!e mmoire allou. *e pointeur est de tApe = void F ?, !e qui <ustiie le !8an"ement de tApe vers = $node-ointer% ? opr par linstru!tion plus 8aut. 4a on!tion = siGeo ? est une on!tion de (i(liot8+que du lan"a"e *. 0lle reHoit en param+tre le nom dun tApe ou dune varia(le et retourne la taille qui lui !orrespond. 4a!!+s lespa!e allou se ait travers la varia(le pointeur qui !ontient son adresse $dans le)emple plus 8aut = p ?% en utilisant loprateur dindire!tion = F ?. 4a varia(le = Fp ? dsi"ne une varia(le de tApe = stru!t 9ode ? pointe par le pointeur = p ?. 4espa!e allou nest pas initialis, il est don! in!orre!t de lutiliser avant dae!ter au) dirents lments $ou !8amps% de !et espa!e des valeurs valides. c) Initialisation de la liste 4a!!+s la liste se ait travers le pointeur de t;te de liste = F ?. .l suit don! de d!larer = F ? et de linitialiser la valeur sp!iale 9@44 pour indiquer que la liste est vide $au dpart%. nodePointer ' ; ' . N3)) ; d) !arcours dune liste chane 9ous supposons quune liste !8aDne e)iste pour notre e)emple $liste des mots an"lais de 1 lettres qui se terminent par = A3 ?% et nous nous proposons de par!ourir !ette liste pour raliser un !ertain traitement sur ses valeurs. -our le moment nous supposons que !e traitement !onsiste ai!8er les valeurs des lments de 1 F.Henni ASD1 2011-2012 la liste. *e par!ours n!essite la !onnaissan!e de ladresse du premier nCud de la liste $t;te de liste%. *ette adresse est sto!Ie dans une varia(le = F ?. 4e par!ours se ait !omme suit , /* parcourir et afficher les valeurs des nuds de la liste, F est le pointeur de tte de liste */ void #fficher)iste /nodePointer '0 { nodePointer p ; /* p est utilis pour parcourir la liste nud par nud */ p . ' ; /* initialisation de p */ while /p4.N3))0 { puts /p56value0 ; p . p56next; } } e) Insertion dune "aleur dans une liste chane -our insrer une nouvelle valeur dans une liste !8aDne e)istante, nous suivrons les tapes suivantes , *rer un nouveau nCud et !opier la valeur insrer dans !e nCud. Si la liste est vide, il suit de , o Faire pointer = F ? sur !e nouveau nCud. o -r!iser que le nCud suivant est = 9@44 ?. Si la liste nest pas vide, il aut trouver la pla!e oJ !e nCud sera insr. 9ous pouvons distin"uer 2 !as , o Si !e nouveau nCud sera insr en t;te il suit de pr!iser que son suivant est le nCud point par = F ?, puis aire pointer = F ? sur le nouveau nCud. o Dans le !as dune insertion ailleurs quen t;te, un par!ours de la liste devient n!essaire. 4e (ut de !e par!ours est de trouver la pla!e oJ sera insr !e nouveau nCud. *e par!ours sarr;tera quand nous trouvons le nCud = s ? de la liste qui va pr!der le nouveau nCud. .l suira ensuite de mettre <our les pointeurs pour raliser linsertion. /* insrer une nouvelle valeur dans la liste chane, F pointeur de tte, val valeur insrer, La fonction retourne un pointeur vers le nud de tte de la nouvelle liste */ nodePointer 7nserer8aleur /nodePointer ' char *val0 { nodePointer p r s ; /* cr9er un nouveau nud pour contenir la valeur insrer et copier la valeur dans ce nud */ r . /NodePointer01alloc /si2eof/struct Node00 ; strcpy /r56value val0; /* insertion du nouveau noeud r dans la liste */ if /'..N3))0 { r56next . ' ; /* cas dune liste vide, insertion en tte */ ' . r; return '; } if /strc1p/r56value '56value0:;0 /* cas dune insertion en tte */ { r56next . '; ' . r; return ' ; } K F.Henni ASD1 2011-2012 /* cas nral, parcours la recherche de la place de r */ p . ' ; /* initialisation de p pour parcourir la liste */ s . p56next; /* p et s se suivent, r se placera entre p et s */ while //s4.N3))0<</strc1p/s56value r56value0:;00 { p . s; s . s56next; } r56next . s; p56next . r; return '; } #) $uppression dune "aleur dune liste chane 4ors de la suppression dune valeur dune liste !8aDne, il aut da(ord sassurer que la valeur supprimer e)iste dans la liste. -our la suppression, deu) !as sont distin"uer , *as dune suppression en t;te, dans !e !as la valeur de = F ? $pointeur de t;te de liste% !8an"e, et il nA a pas de par!ours. *as dune suppression au milieu $ou la in% de la liste. Dans !e !as un par!ours est n!essaire. .l !onsiste retrouver la position du nCud !ontenant la valeur $ supprimer%. 4orsque !e nCud est trouv, !est le nCud qui le pr!+de $dans la liste% qui est mis <our. /* suppri!er le noeud "ui a la valeur val de la liste de tte F, retourne le pointeur de tte de la nouvelle liste */ nodePointer =uppri1er8aleur /nodePointer ' char *val0 { nodePointer p s ; if /'..N3))0 return N3)); /* carter le cas dune liste vide */ if /4strc1p/'56value val00 /* cas de suppression en tte de liste */ { s . ' ; /* s est le nud suppri!er */ ' . '56next ; free /s0 ; return '; } /* cas nral, parcourir la liste la recherche de val */ p . ' ; /* initialisation de p pour parcourir la liste */ s . p56next; /* s est le nud suppri!er */ while //s4.N3))0<</strc1p/s56value val000 { p . s; s . s56next; } L F.Henni ASD1 2011-2012 if /s4.N3))0 /* vrifier "ue la valeur val a t trouve */ { p56next . s56next ; free /s0 ; } return ' ; } *ommentaires , 4a on!tion = ree ? est une on!tion de (i(liot8+que du lan"a"e *. 0lle reHoit en param+tre une varia(le de tApe pointeur qui !ontient ladresse dun espa!e mmoire allou auparavant par la on!tion = mallo! ?. 4e rMle de la on!tion = ree ? est de li(rer lespa!e mmoire point par la varia(le donne en param+tre. *et espa!e devient utilisa(le pour une autre allo!ation. Si lespa!e allou par = mallo! ? nest pas li(r par = ree ?, !et espa!e reste allou m;me sil nest plus utilis, !e qui !onstitue une mauvaise "estion de la mmoire. Apr+s linstru!tion = ree$s% ?, le pointeur = s ? devient indini. .l est don! in!orre!t de lutiliser sans une nouvelle initialisation. N