Vous êtes sur la page 1sur 26

Algorithmique et structure de

données

1è𝑟𝑒 Année Prépa


Semestre 2

ASD 1È𝑟𝑒 ANNÉE PRÉPA 2019/2020 1


Algorithmique
Chapitre 3: Les Listes linéaires

ASD 1È𝑟𝑒 ANNÉE PRÉPA 2019/2020 2


I- La notion de type de données abstrait(TDA)

• Un TDA est un ensemble de données et d'opérations sur ces


données.
• Un TDA est une vue logique (abstraite) d'un ensemble de données,
associée à la spécification des opérations nécessaires à la création,
à l'accès et à la modification de ces données.
• Un TDA est un ensemble de données, organisé pour que les
spécifications des données et des opérations sur ces données
soient séparées de la représentation interne des données et de la
mise en œuvre des opérations.

ASD 1È𝑟𝑒 ANNÉE PRÉPA 2019/2020 3


I- La notion de type de données abstrait(TDA)

Un TDA est caractérisé par :

• Son identité (nom, adresse en mémoire).


• Le type des données qu'il manipule (ce qui définit son état ou caractéristiques).
• Les opérations sur les données (sous-programmes définis dans le TDA).
• Les propriétés de ces opérations (axiomes permettant de définir le TDA).

ASD 1È𝑟𝑒 ANNÉE PRÉPA 2019/2020 4


I- La notion de type de données abstrait(TDA)
Les principaux types de données abstraits sont généralement
regroupés de la façon suivante :
• les structures séquentielles : en particulier les listes ainsi que
deux cas particuliers de celles-ci : les piles et les files,
• les structures arborescentes : arbres binaires et arbres dessinés
généraux,
• les structures relationnelles que sont les graphes,
• les structures à accès par clé que sont les tables (internes ou
externes).

ASD 1È𝑟𝑒 ANNÉE PRÉPA 2019/2020 5


II- Le type de données « Liste »

Définition
• Une liste est une suite ordonnée d'éléments, ce qui signifie qu'à chaque
élément est associé un certain rang dans la liste (1er, 2ème, etc.).

• On peut ajouter ou supprimer un élément en n’importe quelle position dans


la liste avec conservation des positions respectives des autres éléments.

• On se donne un moyen de parcourir la liste : pour savoir quel est le premier


élément, ou bien, étant donné un élément, savoir aller au suivant.

ASD 1È𝑟𝑒 ANNÉE PRÉPA 2019/2020 6


II- Le type de données « Liste »
Opérations définies sur les listes
• Créer liste: permet de créer une liste vide
• Liste vide: permet de voir la vacuité d'une liste linéaire
• Ajouter: permet d'ajouter un élément à la liste linéaire
• Supprimer: permet de supprimer un élément donné de la liste
• Chercher: permet de chercher un élément donné de la liste
• Visiter: permet de visiter (ou parcourir) tous les éléments de la liste. Pour
chaque élément visité on lui applique un traitement donné (afficher par
exemple)
…….
ASD 1È𝑟𝑒 ANNÉE PRÉPA 2019/2020 7
II- Le type de données « Liste »
Représentation physique
• Représentation contigüe d’une liste(statique)
L'allocation de l'espace se fait tout à fait au début d'un traitement. En
termes techniques, on dit que l'espace est connu à la compilation. C'est
donc la notion de tableau.

• Représentation chainée d’une liste (dynamique)


L'allocation de l'espace se fait au fur et à mesure de l'exécution du
programme. Pour pouvoir faire ce type d'allocation, on doit disposer des
deux opérations : allocation et libération de l'espace.

ASD 1È𝑟𝑒 ANNÉE PRÉPA 2019/2020 8


III- Représentation contigüe d’une liste(statique)

Cette façon de modélisation consiste à allouer à l'avance un certain nombre de


maillons. Autrement dit, un tableau de nœuds, de taille fixe est alloué à la création de
la liste. Par la suite, la liste est formée en utilisant comme nœuds des cases de ce
tableau.

Liste = structure
NbElem: entier
tab: tableau [1 .. Max] de type
Fin

ASD 1È𝑟𝑒 ANNÉE PRÉPA 2019/2020 9


IV- Représentation chaînée d’une liste(dynamique)

Cette forme permet de manipuler des listes d’éléments dont on ne connaît pas le
nombre à priori.
• La taille de la liste chaînée peut varier au cours du temps (Contrairement au
tableau, la liste n'est pas allouée en une seule fois).
• chaque élément est alloué indépendamment, sous la forme d'un nœud.
• Les éléments d’une liste chaînée sont répartis dans la mémoire et reliés entre
eux par des pointeurs.
• L’ajout et la suppression des éléments d'une liste chaînée à n'importe quel
endroit, à n'importe quel instant, sans devoir recréer la liste entière, ni faire de
décalages.

ASD 1È𝑟𝑒 ANNÉE PRÉPA 2019/2020 10


IV- Représentation chaînée d’une liste(dynamique)
Un nœud est une structure composée de deux champs :

nœud = structure
info: type
suivant: * nœud
fin
Liste:*nœud

Chaque élément pointe, à l'aide de l'attribut suivant, vers l'élément suivant dans la liste.

Remarques :
• Le type de l’information peut être n’importe quel type : entier, caractère, chaîne,
tableau, structure, pointeur, ...
• Dans une liste chainée, un élément ne voit qu’un seul autre élément (son suivant)

ASD 1È𝑟𝑒 ANNÉE PRÉPA 2019/2020 11


IV- Représentation chaînée d’une liste(dynamique)

Pour manipuler une liste chaînée, on manipulera un simple pointeur sur le


premier élément; comme chaque élément « connaît » l'élément suivant, on peut
ainsi accéder à tous les éléments de la liste.
Exemple : soit L une liste à 4 éléments (noeud) :
La liste L

info suivant

a b c d

L noeud

Le dernier élément n'a pas de suivant, donc son attribut suivant vaut null.

ASD 1È𝑟𝑒 ANNÉE PRÉPA 2019/2020 12


A- Création d’une liste

La procédure « créerliste » permet de créer une liste vide

procédure créerliste (var L : Liste)

début

L null
L
fin

ASD 1È𝑟𝑒 ANNÉE PRÉPA 2019/2020 13


B- Vacuité d'une liste

La fonction « listevide » permet de tester si la liste est vide.

fonction listevide(L:Liste):booléen

début
si (L=null) alors
listevide vrai
sinon L
listevide faux
fin

ASD 1È𝑟𝑒 ANNÉE PRÉPA 2019/2020 14


C- Taille d'une liste

La fonction « Taille » permet de retourner le nombre d’éléments de la liste.


fonction Taille (L:Liste): entier
variables
p:*nœud
nb: entier
début
nb 0
p L
tant que(p # null)
nb nb+1
p *p. suivant
fin tant que
Taille nb
fin
ASD 1È𝑟𝑒 ANNÉE PRÉPA 2019/2020 15
C- Opérations d’insertion

Plusieurs manières d’insertion :


• insérer avant le premier élément
• insérer après le dernier élément
• insérer après un élément référencé
• …

ASD 1È𝑟𝑒 ANNÉE PRÉPA 2019/2020 16


C- Opérations d‘insertion

1) Insérer avant le premier élément (en tête)

info suivant
procédure ajout_tete(var L:Liste , x: entier)
variable:
p:*nœud a b
début
L
allouer(p)
*p.info x p
*p.suivant L e
L p
fin

ASD 1È𝑟𝑒 ANNÉE PRÉPA 2019/2020 17


C- Opérations d'insertion

2) insérer après le dernier élément (en queue)


procédure ajouter_queue(var L:Liste, x: entier)
q
variables: info suivant
p,q:*nœud
début
allouer(p) a b
*p.info x
*p.suivant null
si (vide(L)) alors L  p L p
si non
q=L
tant que(*q.suivant # null) faire e
q=*q.suivant
fin tant que
*q.suivant = p
fin si
fin È𝑟𝑒
ASD 1 ANNÉE PRÉPA 2019/2020 18
D- Opérations de suppression

Plusieurs manières de suppression :


• supprimer le premier élément
• supprimer le dernier élément
• supprimer un élément référencé
• …

ASD 1È𝑟𝑒 ANNÉE PRÉPA 2019/2020 19


D- Opérations de suppression

1. Supprimer le premier élément

p
procédure supprimer_tete(var L:Liste)
variable: p:*nœud
début a b c
si (vide(L) alors écrire("suppression impossible")
sinon
pL L
L  *p.suivant
libérer(p)
finsi
fin

ASD 1È𝑟𝑒 ANNÉE PRÉPA 2019/2020 20


D- Opérations de suppression

2. Supprimer le dernier élément


procédure supprimer_queue(var L:Liste)
variables: p,q:*nœud q p
début
si (vide(L) alors écrire("suppression impossible")
sinon
pL a b c
si(*p.suivant=null) alors (*un seul élément*)
L  null
libérer (p) L
sinon
tant que (*p.suivant # null)
qp
p  *p.suivant
fin tant que
*q.suivant  null
libérer(p)
finsi
finsi
fin
ASD 1È𝑟𝑒 ANNÉE PRÉPA 2019/2020 21
E- Recherche d'un élément

fonction chercher( L:Liste, x:entier): booléen


variables:
p:*nœud
trouve: booléen
début
trouve =faux
pL
tant que (p#null et trouve=faux) faire
si ( *p.info=x) alors
trouve = vrai
p  *p.suivant
fin tant que
chercher  trouve
fin

ASD 1È𝑟𝑒 ANNÉE PRÉPA 2019/2020 22


F- Affichage des éléments

Procédure affiche( L: Liste, x:entier)


variable:
p:*nœud
début
pL
tant que (p#null) faire
écrire(*p.info)
p  *p.suivant
fin tant que
fin

ASD 1È𝑟𝑒 ANNÉE PRÉPA 2019/2020 23


V- Listes chainées particulières
1) Liste avec une tête et un queue

Pour faciliter l'accès au dernier nœud (pour faire une insertion ou suppression en
queue...) on peut conserver un pointeur queue(ou dernier) sur la fin de la liste.

info suivant

a b c d

queue
tête

ASD 1È𝑟𝑒 ANNÉE PRÉPA 2019/2020 24


V- Listes chainées particulières
2) Liste doublement chainée:
L'idée ici consiste à rajouter un « chaînage arrière » (vers le prédécesseur), permettant un
parcours de la liste dans les deux directions (parcours de gauche à droite et de droite à gauche )

précédent info suivant

a b c d

ASD 1È𝑟𝑒 ANNÉE PRÉPA 2019/2020 25


V- Listes chainées particulières
3) Liste circulaire ou anneau:
Le dernier élément pointe sur le premier élément de la liste

info suivant

a b c d

entrée

ASD 1È𝑟𝑒 ANNÉE PRÉPA 2019/2020 26