Vous êtes sur la page 1sur 5

Karine Deschinkel

2007/2008

CHAPITRE 13 : LES LISTES CHAINEES

1 Dfinition
Pour stocker une collection dinformations et saffranchir du problme pos lors de la rservation stati ue de place mmoire !effectue lors de la dclaration du tableau par e"emple#$ on utilise une structure de donne appele liste cha%ne& 'ne liste cha%ne est constitue dun ensemble de cellules cha%nes entre elles ui contiennent les informations ( mmoriser& ) emplacement mmoire ncessaire ( cha ue cellule est allou d*nami uement& Dans une version simple de liste cha%ne$ cha ue cellule comprend llment de la liste ( mmoriser et ladresse de la cellule suivante& )a dernire cellule contient un pointeur ui contient une adresse nulle$ ce ui indi ue la fin de la liste& +est ladresse de la premire cellule ui dtermine la liste&

2 Implantation dune liste chane (en langage C)


,n suppose dans la suite ue les valeurs ( mmoriser sont de t*pe rel$ mais videmment tout autre t*pe de donnes est possible !m-me tableau"$ structures$ listes$.# ,n dfinit un t*pe structure cellule re/roupant une valeur relle et un pointeur& struct cellule 0 float val 1 struct cellule 2 suivant1 31 ,n dfinit un t*pe structure )iste avec un pointeur prem dbut de la liste& struct )iste 0 struct cellule 2 prem 1 3 )iste 1 ui dsi/ne le

// 4nitialisation de la liste vide void initialiser_liste (Liste * L) 0 !2)#&prem 5 6')) 1 3

Karine Deschinkel

2007/2008

// 7fficha/e de la liste void affi !er_liste (Liste L) 0 struct cellule 2 debut 1 debut 5 )&prem 1 8hile !debut956'))# 0 printf!:;<&=f :$ debut >? val#1 debut 5 debut >? suivant1 3 printf!:@n:#1 3 // 4nsertion dune nouvelle cellule en dbut de liste void inserer_"re#ier (Liste* L$ float vale) 0 struct cellule 2 nouveau 1 nouveau 5 !struct cellule 2# malloc !siAeof!struct cellule## 1 nouveau >? val 5 vale1 nouveau >? suivant 5 )>? prem 1 )>? prem 5 nouveau 1 3 // 4nsertion dune nouvelle cellule en fin de liste void inserer_fin (Liste* L$ float vale) 0 struct cellule 2 nouveau $ 2 parcours1 nouveau 5 !struct cellule 2# malloc !siAeof!struct cellule## 1 nouveau >? val 5 vale1 nouveau >? suivant 5 6'))1 if !)>? prem 55 6'))# 0 )>? prem 5 nouveau 1 3 else 0 parcours 5 )>? prem 1 8hile ! parcours >? suivant 956'))# 0 parcours 5 parcours >? suivant 1 3 parcours >?suivant 5 nouveau 1 3 3

Karine Deschinkel

2007/2008

// Buppression dune cellule en dbut de liste float enlever_"re#ier (Liste* L) 0 struct cellule 2 inter1 float vale 1 if !)>? prem 95 6'))# 0 inter 5 )>? prem 1 )>? prem 5 inter >? suivant1 vale 5 inter >? val 1 free!inter# 1 return !vale# 1 3 else 0 return!>=#1 3 3 // Buppression dune cellule en fin de liste float enlever_fin (Liste* L) 0 struct cellule 2 pred$ 2 parcours1 float vale 1 if !)>? prem 95 6'))# 0 parcours 5 )>? prem 1 pred 5 )>? prem 1 8hile ! parcours >? suivant 956'))# 0 pred 5 parcours 1 parcours 5 parcours >? suivant 1 3 vale 5 parcours >? val 1 if !parcours 55 )>? prem# 0 )>?prem 5 6')) 1 3 else 0 pred >? suivant 5 6'))1 3 free!parcours#1 return !vale#1 3 else return !>=#1 3

Karine Deschinkel

2007/2008

// Cecherche dune valeur dans la liste int re !er !e (Liste L$ float vale) 0 struct cellule 2 parcours1 if !)&prem 55 6'))# 0 return!0# 1 3 else 0 parcours 5 )&prem 1 8hile !! parcours >? suivant 956'))# DD !parcours >? val 95 vale## 0 parcours 5 parcours >? suivant 1 3 if !parcours >? val 55 vale# return !=#1 else return !0#1 3 3 // Buppression dune valeur dans la liste int s%""ri#e(Liste* L$ float vale) 0 struct cellule 2 pred$ 2 parcours1 if !)>? prem 95 6'))# 0 parcours 5 )>? prem 1 pred 5 )>? prem 1 8hile !!parcours >? suivant 956'))#DD!parcours >? val 95 vale## 0 pred 5 parcours 1 parcours 5 parcours >? suivant 1 3 if !parcours >? val 55 vale# 0 if !)>? prem 55 parcours# )>? prem 5 parcours >? suivant1 else pred>?suivant 5 parcours>? suivant 1 free !parcours# 1 3 3 3

Karine Deschinkel

2007/2008

3 Autre implantation des listes


3&1 Liste ave t'te fi tive Pour viter davoir un traitement particulier pour les insertions ou suppressions en dbut de liste$ on peut mettre en t-te de la liste une cellule ui ne contient pas dlment et ui reste touEours en t-te& De cette manire les insertions et suppressions ne sont plus faites en t-te de liste& prem t-te fictive cellule = cellule 2 val=

3&( Liste !a)n*e ir %laire 7u lieu de mettre 6')) comme valeur de champ suivant pour le dernier lment de la liste$ on peut mettre la valeur du pointeur de t-te$ la liste est alors circulaire& Bi maintenant la variable reprant la liste repre le dernier lment au lieu du premier$ on aura accs ( celui>ci par simple indirection& ,n obtient ainsi un accs direct au" deu" bouts de la liste&

+ellule =

cellule 2

cellule F

prem

3&3 Liste do%+le#ent !a)n*e Pour faciliter le parcours de la liste dans les deu" sens$ on peut utiliser un double cha%na/e$ cha ue cellule permet laccs ( la cellule prcdente et ( la cellule suivante& val2 G-te Hueue valF

Vous aimerez peut-être aussi