Académique Documents
Professionnel Documents
Culture Documents
1
Algorithmique
Al ith i ett Structures
St t de
d
Donnes
Jean-Charles Rgin
Prsentation
Listes doublement chanes
Implmentation
E
Exemple l d
dutilisation
tili ti d de lilistes
t
P t ti hhabituelle
Prsentation bit ll dde certains
t i algorithmes
l ith :
On a un tableau dentiers
On veut trier ce tableau
R h h dichotomique
Recherche di h t i : ce quii nous intresse
i t
nest pas la valeur,
nest pas uniquement lappartenance de la valeur
cest la position de la valeur dans le tableau, donc son indice
Il estt plus
l pratique
ti de
d travailler
t ill di
directement
t t avec d
des objets
bj t ett
dassoci des valeurs ces objets
En java :
Class onObjet {}
MonObjet mobj1=new MonObjet();
MonObjet mobj2=new MonObjet();
dfinit 2 objets
MonObjet obj; // dfinit un autre objet
obj=mobj1;
obj.setValue(8);
bj tV l (8) // change
h une donne
d de d mobj1
bj1
obj=mobj2;
obj.setValue(12); // change une donne de mobj2
obj
b change
h indirectement
d mobj1
b 1 et mobj2,
b 2 cest
une indirection
d
On a donc besoin dindirections !
Un pointeur
U i t estt un ttype d
de d
donnes
dont
d t la
l valeur
l fait
f it
rfrence (rfrencie) directement (pointe vers) une
autre valeur.
Une liste
li chane
h dsigne une structure de donnes
reprsentant une collection ordonne et de taille
arbitraire
bit i d'lments.
d'l t
L'accs aux lments d'une liste se fait de manire
squentielle
i ll
chaque lment permet l'accs au suivant
( t i
(contrairementt au cas du
d tableau
t bl dans
d lequel
l l ll'accs
se
fait de manire absolue, par adressage direct de
cchaque
aque cellule
ce u e dudit
dud tableau).
ab eau).
Un lment contient un accs vers une donne
LLe principe
i i dde la
l liste
li t chane
h estt que chaque
h l
lmentt
possde, en plus de la donne, des pointeurs vers les
lments qqui lui sont logiquement
gq adjacents
j dans la
liste.
premier(L)=e1
i (L)= 1
suivant(e1) = e2
suivant(e2) = e3
suivant(e3) = nil
Suppression
pp dun lment
A partir de l dautres
d autres oprations vont tre
obtenues : recherche dune donne, remplacement,
concatnation
t ti d de liliste,
t ffusion
i d de listes,
li t etc.
t
L principal
Le i i l avantage
t des
d listes
li t sur les
l tableaux
t bl
Lordre des lments de la liste peut tre diffrent de leur
ordre en mmoire.
Les listes chanes vont permettre lajout ou la suppression
dun lment en nimporte quel endroit de la liste en temps
constant.
constant
En revanche
revanche, certaines oprations peuvent devenir
coteuses comme la recherche dun lment contenant
une certaine donne. Pas de recherche dichotomique
d
dans une liste
li : on ne peut pas atteindre
i d le
l ime
i
lment sans parcourir !
Newellll et Simon
N S ont obtenu
b lACM TTuring Award
A d en
1975 pour avoir "made basic contributions to
artificial
tifi i l intelligence,
i t lli the
th psychology
h l off human
h
cognition, and list processing".
initListe(L)
i itLi t (L)
premier(L) nil
nombreElements(L) : entier
t 0;
cpt 0
elt premier(L)
tant que(elt nil){
cpt cpt +1
elt suivant(elt)
}
retourner cpt
On ajoute un lment
O l eltl au dbut
d b ded la
l liste.
l
On suppose quil nest pas dj dans la liste (sinon que
se passe til
il ?)
Principes :
Le premier de la liste deviendra elt
Mais o est le premier ? Il devient le suivant de elt
Attention lordre de mise jour ! On ne doit pas perdre le
premier Donc
premier.
Le suivant de elt est mis jour
Puis le premier de la liste
ajouteAuDbut(elt,L)
// elt nest pas dans L
suivant(elt) premier(L);
premier(L) elt
On insre un lment
O l eltl aprs un autre p.
On suppose que elt nest pas dj dans la liste et que p
y est (sinon
(i que se passe til
il ?)
e1 p e3
e1 p e3
x
Principes : elt
Le suivant de elt devient le suivant de p
Le suivant de p devient elt
Attention lordre de mise jour !
insreAprs(elt,p,L)
//elt pas dans L, p est dans L
suivant(elt) suivant(p);
suivant(p) elt
Le suivant du p
prcdent devient le suivant de elt
dp d d3
p elt e3
Le suivant du p
prcdent devient le suivant de elt
dp d d3
p elt e3
Le suivant du p
prcdent devient le suivant de elt
dp d d3
p elt e3
dp d d3
p elt e3
supprime(elt,p,L)
//elt est dans L, p son prcdent
if (premier(L) = elt){
premier(L) suivant(elt);
} else {
if (suivant(p) = elt){
suivant(p) suivant(elt);
}
}
Prsentation
Listes doublement chanes
Implmentation
E
Exemplel d
dutilisation
tili ti d de lilistes
t
Liste simplement
p chane :
donne(elt) dsigne la donne associe llment elt
suivant(elt) dsigne lllment
lment suivant elt
Liste doublement chane :
donne(elt)
d ( l) dsigne
d i lla d
donne
associe
i llment
ll eltl
suivant(elt) dsigne llment suivant elt
Reprsentation : lien
d1 d2 d3
e1 e2 e3
premier(L)=e1
suivant(e1) = e2; prcdent(e1) = nil
suivant(e2) = e3; prcdent(e2) = e1
suivant(e3) = nil; prcdent(e3) = e2
Suppression
pp dun lment
A partir de l dautres
d autres oprations vont tre
obtenues : recherche de donne, remplacement,
concatnation
t ti d de liliste,
t ffusion
i d de listes,
li t etc.
t
ajouteAuDbut(elt,LD)
//elt nest pas dans LD
suivant(elt) premier(LD);
prcdent(premier(LD)) elt;
prcdent(elt) nil;
premier(LD) elt
d1 dp d3
e1 p e3
elt
d1 dp d3
e1 p e3
elt
d1 dp d3
e1 p e3
elt
d1 dp d3
e1 p e3
elt
insreAprs(elt,p,LD)
//elt pas dans LD, p dans LD
suivant(elt) suivant(p);
prcdent(elt) p;
prcdent(suivant(p)) elt;
suivant(p) elt;
insreAprs(elt,p,LD)
//elt pas dans LD, p dans LD
suivant(elt) suivant(p);
prcdent(elt) p;
prcdent(suivant(p)) elt;
suivant(p) elt;
insreAprs(x,y,LD)
i ( )
//elt pas dans LD, p dans LD
suivant(elt)
i t( lt) suivant(p);
i t( )
prcdent(elt) p;
if (suivant(p) nil){
prcdent(suivant(p)) elt;
}
suivant(p) elt;
Le suivant du p
prcdent devient le suivant de elt
Le prcdent du suivant devient le prcdent de elt
d1 d d3
e1 elt e3
Le suivant du p
prcdent devient le suivant de elt
Le prcdent du suivant devient le prcdent de elt
d1 d d3
e1 elt e3
Le suivant du p
prcdent devient le suivant de elt
Le prcdent du suivant devient le prcdent de elt
d1 d d3
e1 elt e3
Le suivant du p
prcdent devient le suivant de elt
Le prcdent du suivant devient le prcdent de elt
d1 d3
e1 elt e3
supprime(elt,LD)
i ( lt LD)
// elt dans LD
suiv suivant(elt);
( );
prec prcdent(elt);
if (prec = nil){
premier(LD) suiv;
} else {
suivant(prec) suiv;
}
if (suiv nil){
prcdent(suiv) prec;
}
Prsentation
Listes doublement chanes
Implmentation
E
Exemple l d
dutilisation
tili ti d de lilistes
t
Par un tableau
A laide de pointeur
p
i t x; // Rserve
int R un emplacement
l t pour un entier
ti en mmoire.
i
x = 10; // Ecrit la valeur 10 dans l'emplacement rserv.
int x;
i t x; // Rserve
int R un emplacement
l t pour un entier
ti en mmoire.
i
x = 10; // Ecrit la valeur 10 dans l'emplacement rserv.
int x;
x=10;;
i t x; // Rserve
int R un emplacement
l t pour un entier
ti en mmoire.
i
x = 10; // Ecrit la valeur 10 dans l'emplacement rserv.
int x;
x=10;
int x;
x=10;;
En C : int
int* px; // pointeur sur un entier
px=&x; (adresse de x)
int x;
x=10;;
En C : int
int* px; // pointeur sur un entier
px=&x; (adresse de x)
int y=*px
Si px contient ladresse de x
S px contient ladresse de x
Si
Alors *px
p contient la valeur qui
q se trouve
ladresse de x, donc la valeur de x
px=&x;
Si jje modifie *px
p alors je
j modifie x
px=&y;
Si je
j modifie
difi **px alors
l jje modifie
difi y
px=&bidule;
Si je modifie *px alors je modifie bidule
px dsigne llobjet
objet point
*px modifie lobjet point
LLe typage
t des
d rfrences
f permett de
d manipuler
i l lesl
donnes rfrences de manire abstraite tout en
respectant
p leurs propres
p p contraintes de type.
yp
Le type
yp de rfrence le plus
p simplep est le pointeur.
p Il
s'agit simplement d'une adresse mmoire.
E JJava : uniquement
En i tddes rfrences
f types
t
2 objet a et b de type MyObject
MyObject obj;
obj=a; si on modifie obj, alors on modifie a
obj=b; si on modifie obj, alors on modifie b
Fonc(obj) : obj est pass en entre/sortie
Reprsentation : lien
l
d1 d2 d3
e1 e2 e3
ListeElement
suivant : pointeur vers ListeElement
prcdent : pointeur vers ListeElement
donne : pointeur vers lobjet
Liste
Premier : pointeur vers ListeElement
class
l ListElt
i l {
ListElt _suiv;
Li tElt _prec;
ListElt
MaClasseDonnee _data;
ListElt(){
_suiv=null;
_prec
prec=null;
null;
_data=null;
}
}
Class List {
ListElt _premier;
List(){
_premier=null;
}
void ajouterEnTete(ListElt elt){ // on ne traite pas les cas elt == null
elt suiv = _premier;
elt._suiv premier;
if (_premier != null)
_premier._prec=elt;
_premier = elt;
elt._prec=null;
}
void
id insererApres(ListElt
i A (Li tElt prec, ListElt
Li tElt elt){
lt){
if (prec == null) ajouterEnTete(elt);
else {
elt._suiv=prec._suiv;
elt._prec=prec;
if (prec._suiv != null){prec._suiv._prec=elt;}
prec._suiv=elt;
}
}
void supprimer(ListElt elt){
if (elt == _premier){_premier = elt._suiv;}
else { // elt._pprec nest p
pas null
_elt._prec._suiv=elt._suiv;
}
if (elt._suiv != null){elt._suiv._prec=elt._prec;}
}
Prsentation
Listes doublement chanes
Implmentation
E emple d
Exemple dutilisation
tilisation de listes
Une liste
l L simplement
l chane
h
Sommet(P) : renvoyer premier(L)
Empiler(P,elt) : ajouterEnTte(L,elt)
Dpiler(P) : supprimerPremier(L)
estVide(P) : renvoyer estVide(L)