Cours de Soir Alg Avancé
Cours de Soir Alg Avancé
Cours de Soir Alg Avancé
Sommaire
Exercices
01-**- Fonction de comptage dans une liste chaînée ......................................................................2
02-**- Fonction de comptage d’occurrences dans une liste chaînée ...............................................2
03-**-Fonction de vérification d’une liste chaînée triée .................................................................2
04-**-Procédure d’insertion en tête de liste chaînée .......................................................................2
05-**-Procédure d’insertion en queue de liste chaînée ...................................................................2
06-**- Procédure d’insertion à une position donnée .......................................................................2
07-**- Procédure de suppression d’un élément d’une liste chaînée à une position donnée ............2
08-**- Fonction de calcul de moyenne des étudiants ......................................................................3
09-**- Procédure de parcours d’une liste circulaire ou anneau .......................................................5
10-**- Procédure d’insertion d’un élément dans une liste doublement chaînée..............................5
11-***- Procédure de suppression d’un élément dans une liste doublement chaînée .....................5
12-***- Procédure de suppression d’un étudiant dans une liste doublement chaînée .....................5
13-***- Procédure d’insertion d’un étudiant dans une liste doublement chaînée triée ...................5
Corrigés
01-**- Fonction de comptage dans une liste chaînée ......................................................................7
02-**- Fonction de comptage d’occurrences dans une liste chaînée ...............................................7
03-**-Fonction de vérification d’une liste chaînée triée .................................................................8
04-**-Procédure d’insertion en tête de liste chaînée .......................................................................8
05-**-Procédure d’insertion en queue de liste chaînée ...................................................................9
06-**- Procédure d’insertion à une position donnée .....................................................................10
07-**- Procédure de suppression d’un élément d’une liste chaînée à une position donnée ..........11
08-**- Procédure de calcul de moyenne des étudiants ..................................................................12
09-**- Procédure de parcours d’une liste circulaire ou anneau .....................................................12
10-**- Procédure d’insertion d’un élément dans une liste doublement chaînée............................13
11-***- Procédure de suppression d’un élément dans une liste doublement chaînée ...................14
12-***- Procédure de suppression d’un étudiant dans une liste doublement chaînée ..................16
13-***- Procédure d’insertion d’un étudiant dans une liste doublement chaînée triée .................17
Page 1/20
On considérera dans les exercices, sauf cas contraire une liste chaînée de ce type :
Type Liste = ^Cellule
Type Cellule = Structure
Info : chaîne de caractères
Suivant : Liste
Fin structure
Tête NbElt = 0
Types :
Ch10 = Chaine de 10 caractères
Ch30 = Chaine de 30 caractères
Ent = entier
Nb = réel
Pe = ^Etudiant
Pn = ^Note
Etudiant = Structure
no : Ch10
nom : Ch30
prenom : Ch30
moy : Nb
eval : Pn
suivant : Pe
fin Structure
Note = Structure
note : Nb
coeff : Ent
suivant : Pn
fin Structure
Faire un schéma de cette structure et vérifier à la page suivante où elle est représentée.
On suppose que tous les champs de la liste des étudiants sont remplis sauf le champ moy. On
suppose que toutes les notes des étudiants et tous les coefficients sont remplis
Écrire une procédure moyennesEtudiants qui parcourt la liste des étudiants, et qui calcule et met à
jour le champ moy de chaque étudiant à l'aide de la liste des notes sur laquelle pointe le champ eval.
La procédure moyennesEtudiants prend en paramètre la tête de la liste des étudiants.
Page 3/20
On peut représenter cette structure par la figure ci-dessous :
no nom prénom moy no nom prénom moy no nom prénom moy no nom prénom moy
note coeff note coeff note coeff note coeff note coeff note coeff
Remarques :
Il se peut qu’un étudiant n’ait pas encore de note. C’est le cas du 3ème étudiant de la liste de l’exemple ci-dessus. Le pointeur eval est égal à Nil.
Page 4/20
09-**- Procédure de parcours d’une liste circulaire ou anneau
Les listes circulaires ou anneaux sont des listes linéaires dans lesquelles le dernier élément pointe
sur le premier. Il n’y a donc ni premier, ni dernier. Il suffit
Anneau de connaître l’adresse d’un élément pour
parcourir tous les éléments de la liste.
Ecrire une procédure traite_liste qui « traite » chaque élément de la liste en appelant une procédure
traiter qui aura comme paramètre un pointeur sur l’élément courant à traiter. La procédure
traite_liste prend en paramètre un pointeur sur un élément quelconque de la liste. On considère que
la liste contient au moins un élément (liste non vide).
Page 5/20
CORRIGES
Page 6/20
On considérera dans les exercices, sauf cas contraire une liste chaînée de ce type :
Type Liste = ^Cellule
Type Cellule = Structure
Info : chaîne de caractères
Suivant : Liste
Fin structure
Tête NbElt = 0
Page 7/20
03-**-Fonction de vérification d’une liste chaînée triée
Ecrire une fonction qui vérifie si une liste chaînée est triée en ordre croissant du champ Info.
Tête
(4)
Adresse
Info (2)
Suivant
p (1)
Page 8/20
procédure insererEnTete( entrée-sortie Tête : Liste, entrée val : chaîne)
/*
* Insère un nouvel élément dans la liste chaînée passée en paramètre
*/
Variables :
p : Liste
Début
allouer(p) /* Création de la nouvelle cellule dans la liste */
p^.info ← val
p^.suivant ← Tête /* liaison (3) */
Tête ← p /* liaison (4) */
Fin
Tête
Adresse
der Info (2)
Nil (3)
(1) p
Pour la fonction dernier, qui permet de récupérer l’adresse du dernier élément de la liste, il faut
parcourir tous les éléments de la liste en mémorisant à chaque fois l’adresse de la cellule
précédente.
Page 9/20
fonction dernier(Tête : Liste) : Liste
/* Renvoie l’adresse du dernier élément d'une liste chaînée non vide */
Variables
q : Liste
Début
q ← Tête
tantque q^.suivant ≠ Nil
q ← q^.suivant
fintantque
retourner(q)
Fin
Tête
Page 10/20
fonction accesPosition(Tête : Liste, pos :entier) : Liste
/* Renvoie l'adresse de l'élément qui est en position "pos", ou Nil s'il
n'y a pas d'élément à cette position. */
Variables
p : Liste /* pointeur de parcours */
Début
P ← Tête
tantque p ≠ Nil ET pos > 1
pos ← pos - 1
p ← p^.suivant
fintantque
retourner(p)
Fin
Tête (1)
3 24 8 56
Info Info Info Info
24 56 8 56 Nil
(2)
precedent sauve
Comme dans le cas de l’insertion il faut déterminer l’adresse de la cellule qui précède celle à
supprimer, c'est-à-dire l’adresse de la position – 1.
Page 11/20
08-**- Procédure de calcul de moyenne des étudiants
On a défini les types suivants :
Ch10 = Chaine de 10 caractères
Ch30 = Chaine de 30 caractères
Ent = entier
Nb = réel
Pe = ^Etudiant
Pn = ^Note
Etudiant = Structure Note = Structure
numero : Ch10 note : Nb
nom : Ch30 coeff : Ent
prenom : Ch30 suivant : Pn
moy : Nb fin Structure
eval : Pn
suivant : Pe
fin Structure
Tête Queue
(5) (6)
P Nouveau
(1) (3) (2) (4)
Tête Queue
(5)
P Nouveau
(1) (3) (2) (4)
Faire pointer le champ Precedent du nouvel élément sur l’élément qui doit le précéder (3),
Faire pointer le champ Suivant du nouvel élément sur l’élément qui doit le suivre (4),
Modifier le pointeur du champ Suivant de l’élément précédent qui doit maintenant contenir
l’adresse du nouvel élément (5),
Modifier le pointeur du champ Precedent de l’élément suivant qui doit maintenant contenir
l’adresse du nouvel élément (6).
Cette procédure insère l’élément Nouveau avant le premier élément portant la valeur "val" dans de
la liste doublement chaînée. La fonction PtV(Tête,Val) renvoie l’adresse du premier élément qui
porte la valeur "val", ou Nil si cette valeur n'existe pas.
procedure insererDansListeDouble( entrée-sortie Tête, Queue : ListeDC,
entrée val : chaine,
entrée nouveau : chaine)
Variables
p, ptVal : ListeDC
Début
ptVal ≠ ptV(Tête, val)
si ptVal ← Nil alors
(1) allouer(p) /* création de la nouvelle cellule dans la liste */
(2) p^.info ← nouveau
(3) p^.precedent ← ptVal^.precedent
(4) p^.suivant ← ptVal
si ptVal = Tête alors /* insertion en tête de liste */
(5) Tête ← p
sinon
(5) ptVal^.precedent^.suivant ← p
finsi
(6) ptVal^.precedent ← p
finsi
Fin
Pour supprimer un élément dans une liste doublement chaînée il faut distinguer 4 cas :
Suppression du premier élément de la liste ;
Suppression du dernier élément de la liste ;
Suppression de l’unique élément de la liste qui est à la fois le premier et le dernier ;
Suppression d’un élément à une position quelconque de la liste.
Page 14/20
Suppression en tête de liste doublement chaînée :
Tête PtVal
(1)
(3) (2)
On fait pointer la tête sur l'élément qui suit l'élément à supprimer (1) ;
On met Nil dans le pointeur Precedent de l'élément qui suit l'élément à supprimer (2);
On libère l'espace occupé par l'élément à supprimer (3).
PtVal Queue
(1)
(2)
On fait pointer la queue sur l'élément qui précède l'élément à supprimer (1) ;
On met Nil dans le pointeur Suivant de l'élément qui précède l'élément à supprimer ;
On libère l'espace occupé par l'élément à supprimer.
(3)
PtVal
(3)
(1)
(2)
Page 15/20
procédure supprimerDansListeDouble( entrée-sortie Tête, Queue : ListeDC,
entrée val : chaine,
sortie ok : booléen)
Variables
ptVal : ListeDC /* pointeur sur l'élément à supprimer */
Début
ptVal ← ptV(Tête, val) /* renvoie l'adresse de la première occurrence de
ok ← faux "val" ou Nil si celle-ci n'existe pas */
si ptVal ≠ Nil alors /* l'elt portant la valeur à supprimer existe */
ok ← vrai
si ptVal = Tête alors /* l'élément est en tête */
(1) Tête ← Tête^.suivant
sinon /* l'élément n'est pas en tête */
(1) PtVal^.precedent^.suivant ← ptVal^.suivant
finsi
si ptVal = Queue alors /* l'élément est en queue */
(2) Queue = PtVal^.precedent
sinon / * l'élément n'est pas en queue */
(2) ptVal^.suivant^.precedent ← ptVal^.precedent
finsi
(3) desallouer(PtVal)
finsi
Fin
Page 16/20
procédure supprimerDansListeEtuDC( entrée-sortie Tête : ListeEtuDC
entrée p : ListeEtuDC)
/* suppression de l'élément pointé par p */
Début
si p = Tête /* l’étudiant à supprimer est en tête de liste */
Tête ← p^.suivant
Sinon /* mise à jour de l'élément précédant */
p^.precedent¨.suivant ← p^.suivant
finsi
si p^.suivant ≠ Nil alors /* l’étud. à supprimer n’est pas le dernier */
p^.suivant^.precedent ← p^.precedent
/* sinon il n'y a pas d'élément suivant à modifier */
finsi
Fin
Elément à insérer :
PtEtu^.Precedent PtEtu^.Suivant
Page 17/20
(2) Insertion du nouvel élément à la place adéquate dans la liste ici entre le 2ème et le 3ème élément
Initialement on a : posEtu
PosEtu^.Precedent^.Suivant
Tête PosEtu^.Precedent
Elément à insérer :
Elément d’adresse 27
ptEtu E8 Nom Prénom Moy
PtEtu^.Precedent PtEtu^.Suivant
(a)
Elément d’adresse 27
ptEtu 54 E8 Nom Prénom Moy 39
(b)
PtEtu^.Precedent PtEtu^.Suivant
Page 18/20
(3) Nouvel étudiant inséré en fin de liste
Initialement on a :
derEtu^.Suivant
derEtu
Elément d’adresse 54
E2 nom Prénom Moy E6 nom Prénom Moy
Elément à insérer :
Elément d’adresse 27
ptEtu E8 Nom Prénom Moy
ptEtu^.Precedent ptEtu^.Suivant
Elément d’adresse 54
E2 Nom Prénom Moy E6 Nom Prénom Moy 27
(b)
Elément d’adresse 27 (a)
ptEtu 54 E8 Nom Prénom Moy
ptEtu^.Precedent ptEtu^.Suivant
Page 19/20
procédure insererEtudiant( entrée-sortie Tête : ListeEtuDC,
entrée numEtu, nomEtu, prenomEtu : chaîne)
Variables
p : ListeEtuDC /* pointeur de parcours */
ptEtu : ListeEtuDC
stop : booléen
Début
allouer(ptEtu) /* création du nouvel étudiant */
ptEtu^.No ← numEtu
ptEtu^.Nom ← nomEtu
ptEtu^.Prenom ← prenomEtu
si Tête = Nil alors /* la liste est vide, l'élément sera unique */
ptEtu^.suivant ← Nil
ptEtu^.precedent ← Nil
Tête ← ptEtu
Queue ← ptEtu
sinon
si numEtu < Tête^.No alors /* insertion en tête */
ptEtu^.suivant ← Tête
ptEtu^.precedent ← Nil
Tête^.precedent ← ptEtu
Tête ← ptEtu
sinon /* parcours de la liste jusqu’à trouver le 1er No
p ← Tête supérieur à celui à insérer */
stop ← faux
tantque p^.suivant ≠ Nil et non stop faire
si p^.No > numEtu alors /* insertion avant p^ */
stop ← vrai
sinon
p ← p^.suivant
fintantque
si p^.No > numEtu alors /* insertion avant le dernier p^ */
ptEtu^.suivant ← p
ptEtu^.precedent ← p^.precedent
p^.precedent^.suivant ← ptEtu
p^.precedent ← ptEtu
sinon /* insertion en fin de liste, après p^ */
ptEtu^.suivant ← Nil
ptEtu^.precedent ← p
p^.suivant ← ptEtu
/* pas d'élément suivant à modifier */
finsi
finsi
Fin
BIBLIOGRAPHIE
WEBOGRAPHIE
http://www.siteduzero.com/tutoriel-3-36245-les-listes-chainees.html
http://liris.cnrs.fr/pierre-antoine.champin/enseignement/algo/listes_chainees/
http://deptinfo.cnam.fr/Enseignement/CycleA/SD/cours/structuress%E9quentielleschain%E9es.pdf
http://pauillac.inria.fr/~maranget/X/421/poly/listes.html#toc2
http://users.skynet.be/Marco.Codutti/esi/web/log2/cours/Liste.pdf
http://membres.lycos.fr/zegour/Publication/Livre3/Cours/Part7.htm
http://wwwens.uqac.ca/~rebaine/8INF805/courslistespilesetfiles.pdf
Page 20/20