Vous êtes sur la page 1sur 69

1.

1
Algorithmique
Al ith i ett Structures
St t de
d
Donnes
Jean-Charles Rgin

Licence Informatique 2me anne

JC Rgin - ASD - L2I - 2010


1.2 Listes
Jean-Charles Rgin

Licence Informatique 2me anne

JC Rgin - ASD - L2I - 2010


Plan
3

Prsentation
Listes doublement chanes
Implmentation
E
Exemple l d
dutilisation
tili ti d de lilistes
t

JC Rgin - ASD - L2I - 2010


Variable
1.4

Une variable sert mmoriser de linformation


Ce qui est mis dans une variable est en fait mis
dans une partie de la mmoire

JC Rgin - ASD - L2I - 2010


Structures de donnes
1.5

Permettent de grer et dorganiser des donnes


Sont dfinies p
partir dun ensemble doprations
p
quelles peuvent effectuer sur les donnes
Une structure de donnes ne regroupe pas
ncessairement des objets du mme type.

JC Rgin - ASD - L2I - 2010


Besoin d
dindirections
indirections
6

P t ti hhabituelle
Prsentation bit ll dde certains
t i algorithmes
l ith :
On a un tableau dentiers
On veut trier ce tableau

Un lment du tableau est directement un type de base (un entier,


un flottant,
flottant un boolen...)
boolen )

Parfois on ne voudrait pas avoir accs la valeur en soit, mais


plutt
l un objet
bj li lindice
li di et associ
i cette valeur
l

On veut simplement parcourir les lments ddun


un ensemble, pas
uniquement les valeurs de ces lments : on associe llment une
valeur

JC Rgin - ASD - L2I - 2010


Besoin d
dindirections
indirections
7

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

On pourrait travailler uniquement avec des indices et des tableaux


Un indice reprsentant un objet particulier

Inconvnient : cest compliqu


quand on veut supprimer un objet (que devient son indice ?)
quand on veut insrer un objet (que devient son indice ?)
quand on veut ajouter un objet (les tableaux doivent tre agrandis)

JC Rgin - ASD - L2I - 2010


Besoin d
dindirections
indirections
8

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 !

JC Rgin - ASD - L2I - 2010


Pointeur
9

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.

Un pointeur rfrencie une valeur situe quelque part


d t en mmoire
dautre i hhabituellement
bit ll t en utilisant
tili t son adresse
d

Un pointeur est une variable qui contient une adresse


mmoire

Un pointeur permet de raliser des indirections : dsigner


des objets, sans tre ces objets

JC Rgin - ASD - L2I - 2010


Pointeur
10

Un pointeur est un type de donnes dont la valeur


pointe vers une autre valeur.

Obtenir la valeur vers laquelle un pointeur pointe


est appel drfrencer le pointeur.

Un pointeur qui ne pointe vers aucune valeur aura


la valeur nil

JC Rgin - ASD - L2I - 2010


Listes
11

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

JC Rgin - ASD - L2I - 2010


Liste
12

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) dsigne le premier lment de la liste


nil dsigne labsence dlment

Liste simplement chane :


donne(elt) dsigne la donne associe llment elt
suivant(elt) dsigne llment suivant elt

JC Rgin - ASD - L2I - 2010


Liste simplement chane
13

Reprsentation : correspondant au suivant


d1 d2 d3
e1 e2 e3

premier(L)=e1
i (L)= 1
suivant(e1) = e2
suivant(e2) = e3
suivant(e3) = nil

JC Rgin - ASD - L2I - 2010


Liste : oprations
14

Trois oprations principales


Parcours de la liste
Ajout dun lment

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

JC Rgin - ASD - L2I - 2010


Liste vs Tableau
15

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 !

JC Rgin - ASD - L2I - 2010


Inventions des listes chanes
16

La reprsentation de listes chanes laide du


diagramme avec une flche vers le suivant a t
propos
par Newell
N ll and
d Sh
Shaw ddans larticle
l ti l
"Programming the Logic Theory Machine" Proc.
WJCC February 1957.
WJCC, 1957

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".

JC Rgin - ASD - L2I - 2010


Lvalue et Rvalue
17

Pour se simplifier la vie, on accepte de faire


suivant(elt) valeur
On remarque quil ny a pas dambigit.
Cela sappelle
s appelle une Lvalue ou Left-value (on accepte
de mettre gauche de laffectation)
L cas normall estt la
Le l Rvalue
R l (right-value)
( i ht l )

JC Rgin - ASD - L2I - 2010


Liste : parcours
18

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

JC Rgin - ASD - L2I - 2010


Liste : ajout dun
d un lment
19

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

JC Rgin - ASD - L2I - 2010


Liste : ajout dun
d un lment
20

ajouteAuDbut(elt,L)
// elt nest pas dans L
suivant(elt) premier(L);
premier(L) elt

JC Rgin - ASD - L2I - 2010


Liste : insertion dun
d un lment
21

On insre un lment elt aprs un autre p.


On suppose
pp que
q elt nest ppas dj
j dans la liste et
que p y est (sinon que se passe-t-il ?)
d1 dp d3
e1 p e3
d
elt

JC Rgin - ASD - L2I - 2010


Liste : insertion dun
d un lment
22

On insre un lment elt aprs un autre p.


On suppose
pp que
q elt nest ppas dj
j dans la liste et
que p y est (sinon que se passe til ?)
d1 dp d3
e1 p e3
d
elt

JC Rgin - ASD - L2I - 2010


Liste : insertion dun
d un lment
23

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 !

JC Rgin - ASD - L2I - 2010


Liste : insertion dun
d un lment
24

insreAprs(elt,p,L)
//elt pas dans L, p est dans L
suivant(elt) suivant(p);
suivant(p) elt

JC Rgin - ASD - L2I - 2010


Liste : suppression dun
d un lment
25

On supprime un lment de la liste.


On a besoin du prcdent ! (Pourquoi ?)
Le premier peut changer !

Le suivant du p
prcdent devient le suivant de elt

dp d d3
p elt e3

JC Rgin - ASD - L2I - 2010


Liste : suppression dun
d un lment
26

On supprime un lment de la liste.


On a besoin du prcdent ! (Pourquoi ?)
Le premier peut changer !

Le suivant du p
prcdent devient le suivant de elt

dp d d3
p elt e3

JC Rgin - ASD - L2I - 2010


Liste : suppression dun
d un lment
27

On supprime un lment de la liste.


On a besoin du prcdent ! (Pourquoi ?)
Le premier peut changer !

Le suivant du p
prcdent devient le suivant de elt

dp d d3
p elt e3

JC Rgin - ASD - L2I - 2010


Liste : suppression dun
d un lment
28

Gestion de tous les cas


elt est le premier
elt nest pas le premier

p est bien le prcdent


p de elt

dp d d3
p elt e3

JC Rgin - ASD - L2I - 2010


Liste : suppression dun
d un lment
29

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);
}
}

JC Rgin - ASD - L2I - 2010


Plan
30

Prsentation
Listes doublement chanes
Implmentation
E
Exemplel d
dutilisation
tili ti d de lilistes
t

JC Rgin - ASD - L2I - 2010


Liste
31

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

prcdent(elt) dsigne llment prcdant elt

JC Rgin - ASD - L2I - 2010


Liste doublement chane
32

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

JC Rgin - ASD - L2I - 2010


Liste : oprations
33

Trois oprations principales


Parcours de la liste
Ajout dun lment

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

JC Rgin - ASD - L2I - 2010


Liste : ajout dun
d un lment
34

ajouteAuDbut(elt,LD)
//elt nest pas dans LD
suivant(elt) premier(LD);
prcdent(premier(LD)) elt;
prcdent(elt) nil;
premier(LD) elt

JC Rgin - ASD - L2I - 2010


Liste : insertion dun
d un lment
35

On insre un lment elt aprs un autre p.


On suppose
pp que
q elt nest ppas dj
j dans la liste et
que p y est (sinon que se passe til ?)

d1 dp d3
e1 p e3

elt

JC Rgin - ASD - L2I - 2010


Liste : insertion dun
d un lment
36

On insre un lment elt aprs un autre p.


On suppose
pp que
q elt nest ppas dj
j dans la liste et
que p y est (sinon que se passe-t-il ?)

d1 dp d3
e1 p e3

elt

JC Rgin - ASD - L2I - 2010


Liste : insertion dun
d un lment
37

On insre un lment elt aprs un autre p.


On suppose
pp que
q elt nest ppas dj
j dans la liste et
que p y est (sinon que se passe-t-il ?)

d1 dp d3
e1 p e3

elt

JC Rgin - ASD - L2I - 2010


Liste : insertion dun
d un lment
38

On insre un lment elt aprs un autre p.


Sont modifis : suivant(p),
(p), prcdent(e3)
p ( ) et
suivant(elt) ; prcdent(elt)

d1 dp d3
e1 p e3

elt

JC Rgin - ASD - L2I - 2010


Liste : insertion dun
d un lment
39

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;

JC Rgin - ASD - L2I - 2010


Liste : insertion dun
d un lment
40

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;

Mauvais code ! Pourquoi ?

JC Rgin - ASD - L2I - 2010


Liste : insertion dun
d un lment
41

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;

JC Rgin - ASD - L2I - 2010


Liste : suppression dun
d un lment
42

On supprime un lment de la liste.


On na pas besoin du prcdent ! (Pourquoi ?)
Le premier peut changer !

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

JC Rgin - ASD - L2I - 2010


Liste : suppression dun
d un lment
43

On supprime un lment de la liste.


On na pas besoin du prcdent ! (Pourquoi ?)
Le premier peut changer !

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

JC Rgin - ASD - L2I - 2010


Liste : suppression dun
d un lment
44

On supprime un lment de la liste.


On na pas besoin du prcdent ! (Pourquoi ?)
Le premier peut changer !

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

JC Rgin - ASD - L2I - 2010


Liste : suppression dun
d un lment
45

On supprime un lment de la liste.


On na pas besoin du prcdent ! (Pourquoi ?)
Le premier peut changer !

Le suivant du p
prcdent devient le suivant de elt
Le prcdent du suivant devient le prcdent de elt

d1 d3
e1 elt e3

JC Rgin - ASD - L2I - 2010


Liste : suppression dun
d un lment
46

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;
}

JC Rgin - ASD - L2I - 2010


Plan
47

Prsentation
Listes doublement chanes
Implmentation
E
Exemple l d
dutilisation
tili ti d de lilistes
t

JC Rgin - ASD - L2I - 2010


Implmentation
48

Par un tableau
A laide de pointeur
p

JC Rgin - ASD - L2I - 2010


Tableaux simulant une liste
49

Tableau S des suivants


S[i] indice de llment suivant llment dindice i
Tableau P des prcdents
P[i] indice de llment
l lment prcdant llment
l lment dindice
d indice i
Liste 2 3 1 5 4
S : [5,3,1,0,4]
P : [3,0,2,5,1]

JC Rgin - ASD - L2I - 2010


Pointeur
50

Un pointeur est un type de donnes dont la valeur


pointe vers une autre valeur.

Obtenir la valeur vers laquelle un pointeur pointe


est appel drfrencer le pointeur.

Un pointeur qui ne pointe vers aucune valeur aura


la valeur nil

JC Rgin - ASD - L2I - 2010


Pointeur Implmentation
51

Un pointeur cest un indice dans le grand tableau


de la mmoire comme vu en TD

JC Rgin - ASD - L2I - 2010


Pointeur Implmentation
52

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.

Une variable est destine contenir une valeur du


type avec lequel
l l elle
ll est d
dclare.
l
Physiquement cette valeur se situe en mmoire.

int x;

JC Rgin - ASD - L2I - 2010


Pointeur Implmentation
53

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;;

&x : adresse de x en C : ici 62

JC Rgin - ASD - L2I - 2010


Pointeur Implmentation
54

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;

En C : int* px; // pointeur sur un entier

JC Rgin - ASD - L2I - 2010


Pointeur Implmentation
55

int x;
x=10;;

En C : int
int* px; // pointeur sur un entier

px=&x; (adresse de x)

JC Rgin - ASD - L2I - 2010


Pointeur Implmentation
56

int x;
x=10;;

En C : int
int* px; // pointeur sur un entier

px=&x; (adresse de x)

int y=*px

JC Rgin - ASD - L2I - 2010


Pointeur Implmentation
57

Si px contient ladresse de x

Alors **px contient


Al ti t lla valeur
l quii se ttrouve
ladresse de x, donc la valeur de x

JC Rgin - ASD - L2I - 2010


Pointeur Implmentation
58

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

Si je change la valeur qui se trouve lladresse


adresse de
x, alors je change la valeur de x,

JC Rgin - ASD - L2I - 2010


Pointeur Implmentation
59

Si px contient ladresse de x, donc *px la valeur de


x

Si je change la valeur lladresse


adresse de xx, alors je
change la valeur de x : *px=5
5

JC Rgin - ASD - L2I - 2010


Pointeur Implmentation
60

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

JC Rgin - ASD - L2I - 2010


Pointeur et rfrence
61

Une rfrence est une valeur qui permet l'accs en


lecture et/ou criture une donne situe soit en
mmoire principale soit ailleurs.

Une rfrence n'est pas la donne elle-mme mais


seulement une information de localisation

Ressemble quelque chose de connu, non ?

JC Rgin - ASD - L2I - 2010


Pointeur et rfrence
62

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.

Mais pointeur typ = rfrence typ

Mais on peut changer le type dun pointeur, pas dune


rfrence (cast/transtypage autoris)

JC Rgin - ASD - L2I - 2010


Pointeur et rfrence
63

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

En C/C++ : pointeurs typs mais type changeable


2 objet
j a et b de type
yp MyObject
y j
MyObject* obj;
obj=&a; si on modifie obj, alors on modifie a
obj=&b;
obj &b; si on modifie obj, alors on modifie b
Fonc(MyObject* obj): en entree/sortie
Fonc(MyObject obj) : en entree

JC Rgin - ASD - L2I - 2010


Liste doublement chane
64

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

JC Rgin - ASD - L2I - 2010


Liste doublement chane
65

class
l ListElt
i l {
ListElt _suiv;
Li tElt _prec;
ListElt
MaClasseDonnee _data;
ListElt(){
_suiv=null;
_prec
prec=null;
null;
_data=null;
}
}

JC Rgin - ASD - L2I - 2010


Liste doublement chane
66

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;}
}

JC Rgin - ASD - L2I - 2010


Plan
67

Prsentation
Listes doublement chanes
Implmentation
E emple d
Exemple dutilisation
tilisation de listes

JC Rgin - ASD - L2I - 2010


Pile : implmentation par une liste
68

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)

Ncessite par rapport un tableau


Plus de place
p
Plus doprations
Plus dallocations

JC Rgin - ASD - L2I - 2010


File : implmentation par une liste
69

Une liste L simplement chane avec fin


dbut(F)
( ) : renvoyer
y premier(L)
p ()
Enfiler(F,elt) : ajouterEnFin(L,elt)
Dfil (F) : supprimerPremier(L)
Dfiler(F) i P i (L)
estVide(F) : renvoyer estVide(L)

Beaucoup plus simple qu


quun
un tableau cette fois
Gestion mmoire plus complexe

JC Rgin - ASD - L2I - 2010

Vous aimerez peut-être aussi