Académique Documents
Professionnel Documents
Culture Documents
4 Liste Circulaire
4 Liste Circulaire
Une liste circulaire est une liste telle que le dernier élément de la liste a pour
successeur le premier élément. On peut ainsi parcourir toute la liste à partir de
n’importe quel élément.
Remarque:
Il est plus avantageux de remplacer l’indication sur le premier élément (tête)
par une indication sur le dernier élément (Queue), ce qui donne facilement
accès au dernier et au premier élément.
tete
300
50 -5 12 111
Q
800
50 -5 12 111
1
Déclaration d’une Liste circulaire
Type listeC = enregistrement Type listeC=^Cellule ;
info :<typeElement> ; Type
svt : ^listeC ; Cellule=enregistrement
fing ; info :<typeElement> ;
variable svt : listeC ;
L : ^listeC ; fing ;
variable
L : listeC ;
2
Ajout d’un élément après une @ donnée
Procedure ajout_elt_ListeC(ES/ tete : ListeC, E/ prd :ListeC, E/ e : <type_elément>)
Debut
p : ListeC ;
Si (tete =nil) alors Allouer(tete) ;
tete ^.info e ;
tete ^.svt tete ;
sinon Allouer(p) ;
p^.info e ;
p^.svt prd^.svt ;
prd^.svt p;
p
Fsi ;
700
Fin
444
3
Ajout d’un élément après une @donnée
Procedure ajout_elt_ListeC(ES/ tete: ListeC, , E/ prd :ListeC, E/ e : <type_elément>)
Debut
p : ListeC ;
Si (tete =nil) alors Allouer(tete) ;
tete ^.info e ;
tete ^.svt tete ;
sinon Allouer(p) ;
p^.info e ;
p^.svt prd^.svt ;
prd^.svt p;
Fsi ;
Fin
444 prd
800 p
tete 800
900
300
50 -5 12 111 - 40
4
Ajout d’un élément après une @donnée
Procedure ajout_elt_ListeC(ES/ tete: ListeC, , E/ prd :ListeC, E/ e : <type_elément>)
Debut
p : ListeC ;
Si (tete =nil) alors Allouer(tete) ;
tete ^.info e ;
tete ^.svt tete ;
sinon Allouer(p) ;
p^.info e ;
C’est la même insertion
p^.svt prd^.svt ; que le transparant
prd^.svt p; précédent
Fsi ;
Fin
prd
p 800
tete
900 300
- 40 50 -5 12 444 111
5
Ajout d’un élément après une @donnée
Procedure ajout_elt_ListeC(ES/ tete: ListeC, , ES/ prd :ListeC, E/ e : <type_elément>)
Debut
p : ListeC ;
Si (tete=nil) alors Allouer(tete) ;
tete^.info <- e ;
tete ^.svt <- tete;
prd <- tete;
sinon Allouer(p) ;
p^.info <- e ;
p^.svt <- prd^.svt ;
prd^.svt <- p;
prd <- prd^.svt; (* prd p *)
Fsi ; prd
6
Suppression d’un élément après une @donnée
Procédure Suppression_apres_ListC (ES/ tete : ListC, ES/ Prd : ListC)
Début
p : ListC ;
Si (tete^.svt=tete) (* une liste avec un seul élément *)
alors
Libérer (tete) ;
tete nil ;
Prd nil;
Sinon 1er cas
p Prd^.svt ;
Prd^.svt p^.svt ;
Si (p=tete) alors tetep^.svt; Fsi ;
Libérer (p) ;
Fsi ;
Fin ; prd p
tete 300 100
300
50 -5 12 111 - 40
100
500 500 700 300
900 300
7
Suppression d’un élément après une @donnée
Procédure Suppression_apres_ListC (ES/ tete : ListC, ES/ prd : ListC)
Début
p : ListC ;
Si (tete^.svt=tete) (*une liste avec un seul élément*)
alors
Libérer (tete) ;
tete nil ;
prd nil; 2eme cas
Sinon
p prd^.svt ;
prd^.svt p^.svt ;
Si (p=tete) alors tetep^.svt; Fsi ;
Libérer (p) ;
Fsi ;
Fin ; p prd
tete tete 900
300
300 100
50 -5 12 111 - 40
100
100 500 700 300
900 300
100
8
Suppression d’un élément après une @donnée
Procédure Suppression_apres_ListC (ES/ tete : ListC, ES/ prd : ListC)
Début
p : ListC ;
Si (tete^.svt=tete) (*une liste avec un seul élément*)
alors
Libérer (tete) ;
tete nil ;
prd nil;
Sinon 3eme cas
p prd^.svt ;
prd^.svt p^.svt ;
Si (p=tete) alors tetep^.svt; Fsi ;
Libérer (p) ;
Fsi ;
prd
Fin ; tete
300
nil
300
nil
111
300
9
Parcourir une liste circulaire
Procédure Affiche_ListC(E/ tete : ListC)
Début
p : ListC ;
Si (tete ≠ nil) alors ptete;
Répéter
Ecrire (p^.info) ;
pp^.svt;
Jusqu’à(p=tete);
Sinon
Ecrire (“la liste est vide”);
Fsi ; 50 -60 12
Fin ;
p p p
tete 300 200 500
300
50 - 60 12
10
Attention
Note:
Pour chaque insertion ou suppression d’un élément de la liste, la nouvelle
liste doit vérifier la définition de la liste circulaire. prd
tete 500
prd
300
tete 500
50 -5 12
300
200 500 300
50 -5 12
12
Exemple d’application
5. Ecrire l’action supprim_Apres( ) qui supprime un élément se trouvant à une
adresse P. Le prototype de cette action est donné comme suit :
procedure supprim_Apres(ES/ prd : ListeC, ES/ P: ListeC )
13