Vous êtes sur la page 1sur 13

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

100 500 800 300

Q
800
50 -5 12 111

100 500 800 300

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

tete prd 800


300 500
50 -5 12 111

100 500 800


700 300

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

100 500 700 300


900 300

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

300 100 500 700 800 300


900

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

Fin 300 tete p


300
nil 900
111 40
300
900
300

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 tetep^.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 tetep^.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 tetep^.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 ptete;
Répéter
Ecrire (p^.info) ;
pp^.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

200 500 300

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

200 500 nil


tete
200
prd -5 12
tete 500 500 300
300
tete
50 -5 12
500
200 500 300
nil 12

Cette façon de 300


tete
Cette façon de construire une détruire la liste est
nil
liste circulaire est interdite interdite
11
Exemple d’application
On s’intéresse à la gestion d’impression des travaux d’un groupe d’étudiants. Ils
sont munis d’une priorité dépendant des utilisateurs. Cette priorité est exprimée
sous forme d’un entier de 1 pour les plus prioritaires à 5 pour les moins prioritaires.
Les travaux sont placés dans UNE LISTE CIRCULAIRE AVEC UNE TETE MOBILE. Un
élément de cette liste est de cette forme : nom_etudiant, nom_fichier et priorité.
1. Donnez la définition (le type) de cette structure.
2. Ecrire l’action paramétrée qui ajoute un élément à la liste circulaire.

Remarque: on transmet à cette action: le nom d’étudiant, le fichier à imprimer et


la priorité.

3. Ecrire une action qui affiche cette liste


4. Ecrire une action qui rend l’adresse de l’étudiant le plus prioritaire (adrMin) et
déplace la tête de la liste sur l’élément précédent cet étudiant. Le prototype de
cette action est donné comme suit :
procédure cherche_Min_Adr_Prec(ES/ tete :ListeC, ES/ adrMin : ListeC )

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 )

Remarque: la suppression d’un élément de la liste simule l’impression des travaux


de l’étudiant le plus prioritaire
6. Ecrire l’algorithme de gestion d’impression des travaux d’un groupe de N
étudiants en utilisant les fonctions crées précédemment:

 Créer la liste de N étudiants


 TQ( il reste des étudiants dans la liste) faire
 Afficher cette liste
 Imprimer le fichier de l’étudiant le plus prioritaire

13

Vous aimerez peut-être aussi