Académique Documents
Professionnel Documents
Culture Documents
2007/2008
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&
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&( 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