Vous êtes sur la page 1sur 62

Structures de données & Algorithmique

Les listes doublement chainées

Omar NAIFAR Enseignant chercheur

ISSAT Kairouan omar.naifar@enis.tn 1


QU’EST-CE QU’UNE LISTE DOUBLEMENT CHAÎNÉE?

2
QU’EST-CE QU’UNE LISTE DOUBLEMENT CHAÎNÉE?

Une liste doublement chainée est une collection d’élément de même type

3
QU’EST-CE QU’UNE LISTE DOUBLEMENT CHAÎNÉE?

Une liste doublement chainée est une collection d’élément de même type

On peut accéder directement au premier et au dernier élément

4
QU’EST-CE QU’UNE LISTE DOUBLEMENT CHAÎNÉE?

Une liste doublement chainée est une collection d’élément de même type

On peut accéder directement au premier et au dernier élément

On peut parcourir la liste dans les deux sens (on peut donc revenir à l’ariere.

5
QU’EST-CE QU’UNE LISTE DOUBLEMENT CHAÎNÉE?

Premier élément Premier élément


de la liste de la liste

Une liste doublement chainée est une collection d’élément de même type

On peut accéder directement au premier et au dernier élément

On peut parcourir la liste dans les deux sens (on peut donc revenir à l’ariere.

6
QU’EST-CE QU’UNE LISTE DOUBLEMENT CHAÎNÉE?

Premier élément Premier élément


de la liste de la liste

@2050 @2140 @2102 @216


Un ensemble d’éléments dispersés dans la mémoire contenant des données

Une liste doublement chainée est une collection d’élément de même type

On peut accéder directement au premier et au dernier élément

On peut parcourir la liste dans les deux sens (on peut donc revenir à l’ariere.

7
QU’EST-CE QU’UNE LISTE DOUBLEMENT CHAÎNÉE?

Premier élément Premier élément


de la liste de la liste

@2050 @2140 @2102 @216


Un ensemble d’éléments dispersés dans la mémoire contenant des données

Une liste doublement chainée est une collection d’élément de même type

On peut accéder directement au premier et au dernier élément

On peut parcourir la liste dans les deux sens (on peut donc revenir à l’ariere.

8
ELEMENT D’UNE LISTE DOUBLEMENT CHAÎNÉE

Contenue

@2050

Élément d’une liste doublement chainée

9
ELEMENT D’UNE LISTE DOUBLEMENT CHAÎNÉE

Contenue

@suivannt

@precedent

@2050

Élément d’une liste doublement chainée

10
EXEMPLE

LD
5 10 7 8 12

c c c c c

@2050 @2140 @2102 @216 @300

Liste doublement chainée d’entiers

11
EXEMPLE

LD
5 10 7 8 12

@2140
c c c c c

@2050 @2140 @2102 @216 @300

Liste doublement chainée d’entiers

12
EXEMPLE

LD
5 10 7 8 12

@2140
c c c c c

NULL

@2050 @2140 @2102 @216 @300

Liste doublement chainée d’entiers

13
EXEMPLE

LD
5 10 7 8 12

@2140 @2102
c c c c c

NULL

@2050 @2140 @2102 @216 @300

Liste doublement chainée d’entiers

14
EXEMPLE

LD
5 10 7 8 12

@2140 @2102
c c c c c

NULL @2050

@2050 @2140 @2102 @216 @300

Liste doublement chainée d’entiers

15
EXEMPLE

LD
5 10 7 8 12

@2140 @2102 @216


c c c c c

NULL @2050

@2050 @2140 @2102 @216 @300

Liste doublement chainée d’entiers

16
EXEMPLE

LD
5 10 7 8 12

@2140 @2102 @216


c c c c c

NULL @2050 @2140

@2050 @2140 @2102 @216 @300

Liste doublement chainée d’entiers

17
EXEMPLE

LD
5 10 7 8 12

@2140 @2102 @216 @300


c c c c c
@2050 @2140 @2102
NULL

@2050 @2140 @2102 @216 @300

Liste doublement chainée d’entiers

18
EXEMPLE

LD
5 10 7 8 12

@2140 @2102 @216 @300


c c c c c
@2050 @2140 @2102
NULL

@2050 @2140 @2102 @216 @300

Liste doublement chainée d’entiers

19
EXEMPLE

LD
5 10 7 8 12

@2140 @2102 @216 @300 NULL


c c c c c
@2050 @2140 @2102
NULL

@2050 @2140 @2102 @216 @300

Liste doublement chainée d’entiers

20
EXEMPLE

LD
5 10 7 8 12

@2140 @2102 @216 @300 NULL


c c c c c
@2050 @2140 @2102 @216
NULL

@2050 @2140 @2102 @216 @300

Liste doublement chainée d’entiers

21
DÉFINIR L’ÉLÉMENT

A la différence des listes simplement chainées, un élément d’une liste doublement chinées doit pointé sur son
suivant Et son précédent. Ce type structuré représente un élément composé de

22
DÉFINIR L’ÉLÉMENT

A la différence des listes simplement chainées, un élément d’une liste doublement chinées doit pointé sur son
suivant Et son précédent. Ce type structuré représente un élément composé de

• Un champ pour représenter le contenue

23
DÉFINIR L’ÉLÉMENT

A la différence des listes simplement chainées, un élément d’une liste doublement chinées doit pointé sur son
suivant Et son précédent. Ce type structuré représente un élément composé de

• Un champ pour représenter le contenue


• Un champ pour représenter l’adresse de l’élément suivant

24
DÉFINIR L’ÉLÉMENT

A la différence des listes simplement chainées, un élément d’une liste doublement chinées doit pointé sur son
suivant Et son précédent. Ce type structuré représente un élément composé de

• Un champ pour représenter le contenue


• Un champ pour représenter l’adresse de l’élément suivant
• Un champ pour représenter l’adresse de l’élément précédent

25
DÉFINIR L’ÉLÉMENT

A la différence des listes simplement chainées, un élément d’une liste doublement chinées doit pointé sur son
suivant Et son précédent. Ce type structuré représente un élément composé de

• Un champ pour représenter le contenue


• Un champ pour représenter l’adresse de l’élément suivant
• Un champ pour représenter l’adresse de l’élément précédent

typedef struct Element


{
type contenue;
Element *suivant;
Element *precedent;

}Element;

26
TROUVER LA FIN

27
TROUVER LA FIN

LD
5 10 7 8 12

@2140 @2102 @216 @300 NULL


c c c c c
@2050 @2140 @2102 @216
NULL

@2050 @2140 @2102 @216 @300

Liste doublement chainée d’entiers

28
TROUVER LA FIN
p
LD
5 10 7 8 12

@2140 @2102 @216 @300 NULL


c c c c c
@2050 @2140 @2102 @216
NULL

@2050 @2140 @2102 @216 @300

Liste doublement chainée d’entiers

29
TROUVER LA FIN
p
LD
5 10 7 8 12

@2140 @2102 @216 @300 NULL


c c c c c
@2050 @2140 @2102 @216
NULL

@2050 @2140 @2102 @216 @300

Liste doublement chainée d’entiers

30
TROUVER LA FIN
p
LD
5 10 7 8 12

@2140 @2102 @216 @300 NULL


c c c c c
@2050 @2140 @2102 @216
NULL

@2050 @2140 @2102 @216 @300

Liste doublement chainée d’entiers

31
TROUVER LA FIN
p
LD
5 10 7 8 12

@2140 @2102 @216 @300 NULL


c c c c c
@2050 @2140 @2102 @216
NULL

@2050 @2140 @2102 @216 @300

Liste doublement chainée d’entiers

32
TROUVER LA FIN
p
LD
5 10 7 8 12

@2140 @2102 @216 @300 NULL


c c c c c
@2050 @2140 @2102 @216
NULL

@2050 @2140 @2102 @216 @300

Liste doublement chainée d’entiers

33
TROUVER LA FIN

Code

Element* TrouverFin(Element *LD)


{
if(LD==NULL)
return LD;
Element *temp,*fin;
temp=LD;
while(temp!=NULL)
{
fin=temp;
temp=temp->suivant;
}

return fin;
}
34
AFFICHAGE A PARTIR DU DÉBUT

35
AFFICHAGE A PARTIR DU DÉBUT
p
LD
5 10 7 8 12

@2140 @2102 @216 @300 NULL


c c c c c
@2050 @2140 @2102 @216
NULL

@2050 @2140 @2102 @216 @300

Liste doublement chainée d’entiers

36
AFFICHAGE A PARTIR DU DÉBUT
p
LD
5 10 7 8 12

@2140 @2102 @216 @300 NULL


c c c c c
@2050 @2140 @2102 @216
NULL

@2050 @2140 @2102 @216 @300

Liste doublement chainée d’entiers

37
AFFICHAGE A PARTIR DU DÉBUT

Code

void AfficherListeDuPremierAuDebut(Element *L)


{
Element *p;
p=L;
printf("Affichage des element de la liste : \n");
while(p!=NULL)
{
printf("(%d,%d)\n",p,p->contenue);
p=p->suivant;
}
printf("\n");
}

38
AFFICHAGE A PARTIR DE LA FIN

39
AFFICHAGE A PARTIR DE LA FIN
p
LD
5 10 7 8 12

@2140 @2102 @216 @300 NULL


c c c c c
@2050 @2140 @2102 @216
NULL

@2050 @2140 @2102 @216 @300

Liste doublement chainée d’entiers

40
AFFICHAGE A PARTIR DE LA FIN
p
LD
5 10 7 8 12

@2140 @2102 @216 @300 NULL


c c c c c
@2050 @2140 @2102 @216
NULL

@2050 @2140 @2102 @216 @300

Liste doublement chainée d’entiers

41
AFFICHAGE A PARTIR DE LA FIN

Code

void AfficherListeDuDernierAuPremier(Element *L)


{
//L représente le dernier élément, vous prouvez utiliser
//la fonction TrouverFin() pour trouver L
Element *p;
p=L;
printf("Affichage des element de la liste : \n");
while(p!=NULL)
{
printf("(%d,%d)\n",p,p->contenue);
p=p->precedent;
}
printf("\n");
}
42
AFFICHAGE A PARTIR DE LA FIN
Résultat main()

int main()
{
Element *LD=NULL;
Element *nouveau;
Element *finLD;
int val=1;
nouveau=CreateElement(val);
InsertDebutLD(&LD,nouveau);
val=2;
nouveau=CreateElement(val);
InsertDebutLD(&LD,nouveau);

AfficherListeDuPremierAuDebut(LD);
finLD=TrouverFin(LD);
AfficherListeDuDernierAuPremier(finLD);
return 0;
}
43
CREATION D’UN ÉLÉMENT

Contenue

@suivannt

@precedent

@2050

Élément d’une liste doublement chainée

44
CREATION D’UN ÉLÉMENT

Code

Element *CreateElement(int val)


{
Element *nouveau=(Element*)malloc(sizeof(Element));
nouveau->contenue=val;
nouveau->suivant=NULL;
return nouveau;

45
INSERTION D’UN NOUVEAU ÉLÉMENT AU DÉBUT DE LA LISTE

LD
5 10 7 8 12
@2140
c @2102
c @216
c @300
c NULL
c
@2050 @2140 @2102 @216
NULL

@2050 @2140 @2102 @216 @300

Liste doublement chainée d’entiers

46
INSERTION D’UN NOUVEAU ÉLÉMENT AU DÉBUT DE LA LISTE

nouveau
LD
4 5 10 7 8 12
c @2140
c @2102
c @216
c @300
c NULL
c
@2050 @2140 @2102 @216
NULL

@400 @2050 @2140 @2102 @216 @300

Liste doublement chainée d’entiers

47
INSERTION D’UN NOUVEAU ÉLÉMENT AU DÉBUT DE LA LISTE

nouveau
LD
4 5 10 7 8 12
@2050
c @2140 @2102 @216 @300 NULL
c
c c c c
@2050 @2140 @2102 @216
NULL

@400 @2050 @2140 @2102 @216 @300

Liste doublement chainée d’entiers

48
INSERTION D’UN NOUVEAU ÉLÉMENT AU DÉBUT DE LA LISTE

nouveau
LD
4 5 10 7 8 12
@2050
c @2140 @2102 @216 @300 NULL
c
c c c c
NULL @2050 @2140 @2102 @216

@400 @2050 @2140 @2102 @216 @300

Liste doublement chainée d’entiers

49
INSERTION D’UN NOUVEAU ÉLÉMENT AU DÉBUT DE LA LISTE

nouveau
LD
4 5 10 7 8 12
@2050
c @2140 @2102 @216 @300 NULL
c
c c c c
NULL @400 @2050 @2140 @2102 @216

@400 @2050 @2140 @2102 @216 @300

Liste doublement chainée d’entiers

50
INSERTION D’UN NOUVEAU ÉLÉMENT AU DÉBUT DE LA LISTE
LD
nouveau

4 5 10 7 8 12
@2050
c @2140 @2102 @216 @300 NULL
c
c c c c
NULL @400 @2050 @2140 @2102 @216

@400 @2050 @2140 @2102 @216 @300

Liste doublement chainée d’entiers

51
INSERTION D’UN NOUVEAU ÉLÉMENT AU DÉBUT DE LA LISTE
Code version 1 (fonction)

Element *InsertDebutLDC(Element *LD,Element *nouveau)


{
nouveau->suivant=LD;
nouveau->precedent=NULL;
if(LD==NULL)
{
return nouveau;
}
LD->precedent=nouveau;
LD=nouveau;
return LD;

52
INSERTION D’UN NOUVEAU ÉLÉMENT AU DÉBUT DE LA LISTE
Code version 2 (procédure)

void InsertDebutLD(Element **LD,Element *nouveau)


{
nouveau->suivant=*LD;
nouveau->precedent=NULL;
if(*LD==NULL)
{
*LD=nouveau;
return;
}

(*LD)->precedent=nouveau;
*LD=nouveau;

53
INSERTION D’UN NOUVEAU ÉLÉMENT AU DÉBUT DE LA LISTE
Résultat main()
int main()
{
Element *LD=NULL;
Element *nouveau;
int val=1;
nouveau=CreateElement(val);
InsertDebutLD(&LD,nouveau);
val=2;
nouveau=CreateElement(val);
InsertDebutLD(&LD,nouveau);
val=3;
nouveau=CreateElement(val);
InsertDebutLD(&LD,nouveau);
val=4;
nouveau=CreateElement(val);
InsertDebutLD(&LD,nouveau);
AfficherListeDuPremierAuDebut(LD);
return 0;
}
54
INSERTION D’UN NOUVEAU ÉLÉMENT A LA FIN DE LA LISTE

LD
5 10 7 8 12
@2140
c @2102
c @216
c @300
c NULL
c
@2050 @2140 @2102 @216
NULL

@2050 @2140 @2102 @216 @300

Liste doublement chainée d’entiers

55
INSERTION D’UN NOUVEAU ÉLÉMENT A LA FIN DE LA LISTE

LD nouveau

5 10 7 8 12 4
@2140
c @2102
c @216
c @300
c NULL
c NULL
c
@2050 @2140 @2102 @216
NULL

@2050 @2140 @2102 @216 @300 @400

Liste doublement chainée d’entiers

56
INSERTION D’UN NOUVEAU ÉLÉMENT A LA FIN DE LA LISTE
dernier
LD nouveau

5 10 7 8 12 4
@2140
c @2102
c @216
c @300
c NULL
c NULL
c
@2050 @2140 @2102 @216
NULL

@2050 @2140 @2102 @216 @300 @400

Liste doublement chainée d’entiers

57
INSERTION D’UN NOUVEAU ÉLÉMENT A LA FIN DE LA LISTE

TrouverFin(); dernier
LD nouveau

5 10 7 8 12 4
@2140
c @2102
c @216
c @300
c NULL
c NULL
c
@2050 @2140 @2102 @216
NULL

@2050 @2140 @2102 @216 @300 @400

Liste doublement chainée d’entiers

58
INSERTION D’UN NOUVEAU ÉLÉMENT A LA FIN DE LA LISTE
dernier
LD nouveau

5 10 7 8 12 4
@2140
c @2102
c @216
c @300
c @400
c NULL
c
@2050 @2140 @2102 @216
NULL

@2050 @2140 @2102 @216 @300 @400

Liste doublement chainée d’entiers

59
INSERTION D’UN NOUVEAU ÉLÉMENT A LA FIN DE LA LISTE
dernier
LD nouveau

5 10 7 8 12 4
@2140
c @2102
c @216
c @300
c @400
c NULL
c
@2050 @2140 @2102 @216
NULL @300

@2050 @2140 @2102 @216 @300 @400

Liste doublement chainée d’entiers

60
INSERTION D’UN NOUVEAU ÉLÉMENT A LA FIN DE LA LISTE
Code version 1 (procédure)

void InserFinLDC(Element **LD,Element *nouveau)


{
if(*LD==NULL)
{
nouveau->precedent=NULL;
*LD=nouveau;
return;
}
Element *dernier;
dernier=TrouverFin(*LD);
nouveau->precedent=dernier;
dernier->suivant=nouveau;

61
INSERTION D’UN NOUVEAU ÉLÉMENT A LA FIN DE LA LISTE
Code version 2 (fonction)

Element *InserFinLDCP(Element *LD,Element *nouveau)


{
if(LD==NULL)
{
nouveau->precedent=NULL;
LD=nouveau;
return LD;
}
Element *dernier;
dernier=TrouverFin(LD);
nouveau->precedent=dernier;
dernier->suivant=nouveau;
return LD;

62

Vous aimerez peut-être aussi