Vous êtes sur la page 1sur 0

F.

Henni ASD1 2011-2012


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

Vous aimerez peut-être aussi