7/31/2019 Les Listes
1/39
1
Chapitre 14: Les listes (structures dynamiques)
Contenu:
Rappel sur la gestion de la mmoire
Notion de liste Liste simple
Liste circulaire bidirectionnelle
Pile et File
Concepts
Implantation sous forme de liste
Liste gnralise
Applications
7/31/2019 Les Listes
2/39
2
Rappel: gestion de la mmoire lors de lexcution
La mmoire est subdivise en 3 parties:
La partie statique contenant principalement le code des
fonctions
La Pile (Stack) run time qui contient principalement les
variables crs statiquement
Le Tas (Heap) run time qui contient les variables cresdynamiquement (par un new)
Code HeapStack
Sommet du stack Limite de l
a zone utilise par le heap(il existe une freelist de zone mmoire allouable)
Zone de mmoirenon encore utilise
7/31/2019 Les Listes
3/39
3
Gestion mmoire dentits statiques
Stack
Stack
:
{ int i, j, k;
:
{ int i, j, k;
:
{ double r;
i
Stack
k
j
Stack
i
kj
r
:
{ int i, j, k;
:
{ double r;:
}
:
{ int i, j, k;
:
{ double r;:
}
}
Stack
i
kj
7/31/2019 Les Listes
4/39
7/31/2019 Les Listes
5/39
5
Gestion de structures dynamiques
But:
grer des structures de donnes contenant plusieurs entits et
dont le nombre dentits varie tout au long de lexcution duprogramme
Exemple:
La liste dlments:
= liste vide
: on ajoute 7
: on ajoute 21
: on ajoute 3
: on supprime 3 : on ajoute 5
7/31/2019 Les Listes
6/39
6
Quest-ce quune liste chane ? Une collectiondlments possdant chacun deux composantes : un
pointeur vers le prochain lment de la liste et une
valeur de nimporte quel type.
Implmentation : les listes chanes
Adr #1
4
Adr #2
3
Adr #3
5
NULL
7/31/2019 Les Listes
7/39
7
Listes chanes
class elem;
typedef elem* liste;
class elem {public:
TypeOfInfo info;liste next;elem():info(0),next(NULL){}elem(TypeOfInfo i, liste n):info(i),next(n) {}
};
main() {
liste first = new elem(5, NULL);first = new elem(3,first);first = new elem(4,first);
}
Adr #1
4
Adr #2
3
Adr #3
5
NULL
// alternative
class elem {public:
TypeOfInfo info;elem* next;elem():info(0),next(NULL){}elem(TypeOfInfo i, elem* n):info(i),next(n){}
};
typedef elem* liste;
7/31/2019 Les Listes
8/39
8
Listes chanes
Parcours
void Parcours(liste tete)
{
for(liste p=tete; p != NULL; p= p-> next)
cout info info != x; p = p-> next);return p!=NULL;
}
7/31/2019 Les Listes
9/39
9
Listes chanes
Recherche dun lment (renvoie le pointeur)
liste Element(liste tete, TypeOfInfo x) {
liste p;
for(p=tete; p!=NULL && p->info != x; p = p-> next);return p;
}
7/31/2019 Les Listes
10/39
10
Listes chanes
Insertion en tte
void InsertionEnTete(liste &tete, TypeOfInfo x) {
tete = new elem(x,tete);}
Insertion en tte (2ime version : dcomposition des
oprations)void InsertionEnTeteV2(liste& tete, TypeOfInfo x) {
liste p = new elem;
p -> info = x;
p -> next = tete;tete = p;
}
X
Y
p
tte
7/31/2019 Les Listes
11/39
11
Listes chanes
Insertion en fin de liste (1)
void InsertionEnFin(liste &tete, TypeOfInfo x) {
if (tete == NULL) // dans une liste videtete = new elem(x,NULL);
else { // dans une liste non vide
liste q = tete;
liste p = tete->next;while (p != NULL) {
q = p;
p = p -> next;
}q -> next = new elem(x,NULL);
}
}
Y
X
p
q
7/31/2019 Les Listes
12/39
12
Listes chanes
Insertion en fin de liste (2)
void InsertionEnFinV2(liste &tete, TypeOfInfo x) {
liste q = NULL;
liste p = tete;
while (p != NULL) {
q = p;
p = p -> next;}
p = new elem(x,NULL);
if (q == NULL)
tete = p; // liste videelse
q -> next = p;
}
7/31/2019 Les Listes
13/39
13
Listes chanes
Insertion en fin de liste (3)
void InsertionEnFinV3(liste& tete, TypeOfInfo x) {
liste p;
if (tete == NULL) {tete = new elem;p = tete;
}
else {for (p = tete; p-> next != NULL; p = p->next);p->next = new elem;p = p->next;
}p->info = x;p->next = NULL;
}
7/31/2019 Les Listes
14/39
14
Listes chanes
Insertion dans une liste trie (1)
void InsertionTriee(liste & tete, TypeOfInfo x) {
if (tete == NULL || tete -> info > x)
tete = new elem(x,tete);else {
liste q = tete;
liste p = tete->next;
while (p != NULL && p->info next;
}q -> next = new elem(x,p);
}
}
7/31/2019 Les Listes
15/39
15
Listes chanes Insertion dans une liste trie (2)
void InsertionTrieeV2(liste &tete, TypeOfInfo x) {
liste q = NULL; liste p = tete;
while (p != NULL && p->info next;
}
if (q == NULL) { // insertion en dbut de liste
tete = new elem;q = tete;
}
else {
q -> next = new elem;q = q->next;
}
q -> info = x;
q -> next = p;
}
7/31/2019 Les Listes
16/39
16
Listes chanes
Suppression dun lment de la liste
Llment supprimer est en tte de liste (X)
Llment supprimer est en milieu de liste (Y)
Llment supprimer est en fin de liste (Z)
X Y Zq p
X Y Z
X Y Z
q p
X Y Z
X Y Z
q p
X Y Z
tte tte
7/31/2019 Les Listes
17/39
17
Listes chanes Suppression dun lment de la liste
void Suppression(liste & tete, TypeOfInfo x) {liste q = NULL;liste p = tete;
while (p != NULL && p->info != x) {q = p;p = p -> next;
}
if (p != NULL) {if (q == NULL)
tete = p->next;else
q->next = p->next;delete p;
}}
7/31/2019 Les Listes
18/39
18
Listes chanes
Suppression dune listevoid SuppressionListe(liste & tete) {
while (tete != NULL) {
liste p = tete;
tete = tete -> next ;
delete p;
}}
7/31/2019 Les Listes
19/39
19
Listes (doublement) chanes circulaires
Adr #1
4
Adr #2
3
Adr #3
5
Adr #1
Adr #1
bidonAdr #2
3Adr #3
5Adr #1
Adr #3 Adr #1 Adr #2
Liste chane circulaire
Liste doublement chane circulaire
7/31/2019 Les Listes
20/39
20
7
Adr #1
Adr #2
Listes doublement chanes circulaires
Adr #1
vide
Adr #2
3
Adr #3
vide *
Adr #1
Adr #3 Adr #1
Adr #1
Pour se simplifier la vie, la liste vide en fait constitue dunlment spcial (lment bidon ) ne contenant pasdinformation: on appelle parfois cet lment prtte"
Adr #1
* 0 mis pas le constructeur
Fait par : tete = new elem;
qui met previous et next this
tete
7/31/2019 Les Listes
21/39
21
Listes doublement chanes circulaires
Dclaration de la classe elem (doublement lie)
class elem;typedef elem* liste;
class elem {
public:TypeOfInfo info;liste previous; // ajout du pointeur vers le prcdentliste next;elem(): info(0),previous(this), next(this){}elem(TypeOfInfo i, liste p, liste n):
info(i),previous(p), next(n){}};
liste tete = new elem;
this est unpointeur vers
lobjet dans
lequel on est
7/31/2019 Les Listes
22/39
22
Listes doublement chanes circulaires
Supprimer un lment de la listevoid Suppression(liste tete, TypeOfInfo x) {
liste p = tete->next;
tete->info=x;while (p->info != x)p = p -> next;
if (p != tete) {// on a donc trouv x (pas celui dans la pretete
p->previous->next = p->next;p->next->previous = p->previous;delete p;
}}
Z
n
p
X
n
Y
n
pp
7/31/2019 Les Listes
23/39
23
Listes doublement chanes circulaires
Insrer un lment devant un autre lment dela liste
void InsAvant(liste e, TypeOfInfo x) {
liste r = new elem(x, e->previous, e);e->previous->next = r;e->previous = r;
}
Z
n
p
X
n
Y
n
p
p
e
7/31/2019 Les Listes
24/39
24
Listes doublement chanes circulaires
Insertion en tte de liste (mais aprs la prtte)
void InsertionEnTete(liste tete, TypeOfInfo x) {
InsAvant(tete->next, x);
}
Insertion aprs un lment
void InsApres(liste e, TypeOfInfo x) {
InsAvant(e->next, x);
}
Insertion en fin de liste (donc avant prtte)
void InsFin(liste tete, TypeOfInfo x) {
InsAvant(tete, x);
}
7/31/2019 Les Listes
25/39
25
Implmentation dune relation m-n
Reprsentation graphique (UML) de fait que chaque
personne peut tre dans plusieurs groupes de
discussion et que chaque groupe de discussion a
plusieurs personnes.
PersonnesGroupes de
discussion* *
Chaque personne a une liste de groupes de discussion Chaque groupe de discussion a une liste de personnes
+ on ne veut pas dupliquer les info sur les personnes et groupes
+ on veut pouvoir mettre des info concernant
chaque lien personne-groupe
Info surLe lien
7/31/2019 Les Listes
26/39
26
Implmentation dune relation m-n (matrice creuse)
=> Objets lien 7 champs de donnes
PnextPersonne Pprec
InfoGprec
GnextGroupe
listeP
Prtte
Gilles
Marc
Thierry
listeG
Prtte
Jogging
Montagne
VTT
7/31/2019 Les Listes
27/39
27
Implmentation dune relation m-n (matrice creuse)
listeP
Prtte
Gilles
Marc
Thierry
liste
G
Pr
tte
Jogg
ing
Mon
tagne
VTT
GJ GM
MM MV
TJ TM TV
7/31/2019 Les Listes
28/39
28
Piles
Une pile est une structure de donne dynamique utilisant leprincipe LIFO (last in, first out)
4 oprations sont permises
IsEmpty: test si la pile est vide
Top : lecture du sommet de pile (sans effet sur la pile)
Pop : suppression du sommet de pile
Push : ajout dun lment sur la pile
Une pile est quivalente une simple liste chane
3
4
2
13
Push Pop13
2
4
3
tete
7/31/2019 Les Listes
29/39
29
Piles
La classe pile est dfinie sur base
d lments, comme la liste
class Element;typedef Element* Stack;
class Element {
public:
Stack next;int data;
Element(): next(NULL),data(0){}
Element(Stack n, int d) : next(n), data(d) {}
};
7/31/2019 Les Listes
30/39
30
Piles
Ajouter un lment au sommet de pilevoid Push(stack &S, int d) {
S = new Element (S, d);}
Tester si la pile est videbool IsEmpty(S) {
return S == NULL;}
Supprimer le sommet de pile
void Pop(stack &S) {
if (! IsEmpty(S)) {stack T = S;
S = S->next;delete T;
} // si la pile est vide, il ne se passe rien}
7/31/2019 Les Listes
31/39
31
Piles
Lire le sommet de pile (si la pile nest pas vide)
int Top(stack S) {
return S->data;
}
Dtruire la pilevoid DeleteStack(stack &S) {
while (! IsEmpty(S)) {stack T = S;S = S->next;delete T;
}}
7/31/2019 Les Listes
32/39
32
Files
Une file est une structure de donne dynamique utilisant leprincipe FIFO (first in, first out)
4 oprations sont permises
IsEmpty: test si la file est vide
First : lecture du premier de la file (sans effet sur la file)
TakeOut : sortie d un lment de la file
PutIn : entre d un lment dans la file
Une file est quivalente une simple liste chane (+ dernier)
3
4
2
13
PutIn
TakeOut13
2
4
3
first
last
In
Out
7/31/2019 Les Listes
33/39
33
Files
La classe file est dfinie sur base
dlments, comme la listeclass Element;
typedef Element* ptr;
class Element {
ptr next;
int data;Element():next(NULL),data(0){}
Element(ptr n, int d) : next(n), data(d) {} };
class Queue {public:
ptr first, last;
};
7/31/2019 Les Listes
34/39
34
Files
Entrer un lment dans la filevoid PutIn(Queue &Q, int d) {
ptr temp = new Element (NULL, d);if (IsEmpty(Q))
Q.first = temp;else
Q.last->next = temp;Q.last = temp;
}
Sortir un lment de la filevoid TakeOut(Queue &Q) {
if (! IsEmpty(Q)) {ptr p = Q.first;Q.first = Q.first->next;
if (IsEmpty(Q))last = NULL;
delete p;}// si la pile est vide, il ne se passe rien
}
7/31/2019 Les Listes
35/39
35
Listes gnralises
Une liste gnralis est construite partir dlments possdant
chacun deux pointeurs vers dautres lments : D (down) pointe
vers une liste situe un niveau infrieur, S (same) pointe vers
une liste situe au mme niveau
Exemple :
Problme : parcourir la liste gnralise niveau par niveau
Dans lexemple : 1 6 7 / 5 2 4 / 3
1 D S
4 D S5 D S
7 D S6 D S
3 D S
2 D S
7/31/2019 Les Listes
36/39
36
Listes gnralises - Les classes
La classe ListeGen est aussi dfinie sur basedlments
class ElGen
typedef ElGen* ListeGen;
class ElGen {public:
ListeGen D, S;int data;ElGen():D(NULL),S(NULL),data(0){}
ElGen(ListeGen d, ListeGen s, int x) : D(d), S(s), data(x){}};
7/31/2019 Les Listes
37/39
37
Listes gnralises - Parcours par niveau
void ParcourslisteGen(ListeGen L) {if (L != NULL) {
Queue Q;
PutIn(Q,L);while (! IsEmpty(Q)) {ListeGen p = First(Q);TakeOut(Q);while (p != NULL) {
cout data D != NULL) PutIn(Q,p->D);p = p->S;
}
}}
}
On utilise une file dont
les lments contiennent
des pointeurs vers des
lments de la liste
gnralise (ElGen)
Exercice : modifier le programme
pour que les donnes saffichent
raison dune ligne par niveau
7/31/2019 Les Listes
38/39
38
Application - Notation polonaise inverse
La notation algbrique directe (NAD) classique peut tre
traduite en une autre notation appele polonaise inverse (NPI,
Jan Lukasiewicz, 1878-1956), et vice-versa
Exemple : A+(B*C)+(D/E) A B C * + D E / +
Lorsquon a sous la main une expression en NPI, il est
extrmement simple de lvaluer : il suffit, en parcourant
lexpression de gauche droite, dempiler les oprandes,
de les dpiler lorsquon rencontre un oprateur et de les remplacer alors
par le rsultat de lopration
Exemple : Push(S,A); Push(S,B); Push(S,C); Multiply(S);Add(S); Push(S,D); Push(S,E); Divide(S); Add(S); et le rsultat
se trouve au sommet de la pile => cout
7/31/2019 Les Listes
39/39
39
Application - Traduction NAD vers NPI
On ne traite que les oprateurs binaires +, -, *, /, ^ et les ( )
Les priorits sont ordonnes comme suit : ( ) < +, - < *, / < ^
En parcourant lexpression NAD de gauche droite : Oprande : directement transmise en sortie
Oprateur : tant que le sommet de la pile a une priorit suprieure ou
gale celle de loprateur dentre, on le sort de la pile ; ensuite, on
empile loprateur rencontr lentre Parenthse ouvrante : empile
Parenthse fermante : tant que le sommet est diffrent dune parenthse
ouvrante, on le sort de la pile ; la parenthse ouvrante en question est
dpile mais non transmise en sortie Fin de lexpression dentre : tout ce qui reste sur la pile est transmis en
sortie
Top Related