Académique Documents
Professionnel Documents
Culture Documents
Structures Séquentielles
ii. Implémentation chainée
2. STRUCTURE DE DONNÉES : PILE
3. STRUCTURE DE DONNÉES : FILE
Structures de Données
BENAZZOUZ 2023‐2024
1.Liste linéaire
Une liste linéaire est la forme la plus courante d'organisation des données. On
l'utilise pour stocker des données qui doivent être traitées de manière
séquentielle. (Structure évolutive, càd pouvoir ajouter et supprimer des éléments).
Définition : Une liste est une suite finie (éventuellement vide) d'éléments de même
type repérés selon leur rang(position) dans la liste.
2
Primitives : On définit le type abstrait de données par la définition des primitives
quii permettent de
d le
l manipuler
i l :
liste créer_liste()
créer liste() : création d
d'une
une liste vide
position début(liste L) : retourne la position du premier élément de la liste, INCONNUE si la
liste est vide
position fin(liste L) : retourne la position du dernier élément de la liste, INCONNUE si la liste
est vide
position suivante(position p, liste L) : retourne la position de l'élément qui suit celui en
position p, INCONNUE si on sort de la liste
position précédente(position p, liste L) : retourne la position de l'élément qui précède celui
en position p, INCONNUE si on sort de la liste
3
Primitives :
élément accès(position p,liste L) : retourne l'élément en position p
insérer(element e, position p, liste L) : rajoute l'élément dans la liste (qui est donc modifiée)
à la position p.
supprimer(position
pp p p,
p liste L) : supprime
pp l'élément de position
p p dans la liste (qui
q est donc
modifiée)
4
Exemples d'utilisation :
Algo Afficher_Liste(liste L) Algo Nb_Occurence(liste L, element e):retourne entier
locales : position i locales : position i , entier nb
debut debut
TailleMax
liste
7
1.2 Implémentation chaînée :
• Les éléments ne sont pas rangés les uns à coté des autres. On a besoin de
connaître,
ît pour chaque
h élément,
élé t la
l position
iti (l'
(l'adresse)
d ) de
d l'élément
l'élé t quii le
l
suit.
• Une adresse s'appelle
s appelle aussi un pointeur (L'adresse
(L adresse nulle sera notée VIDE.)
VIDE )
8
1.2 Implémentation chaînée :
type cellule = {
valeur
l : element
l t
suivant : adresse d'une cellule
}
type liste = adresse d'une cellule
9
1.2 Implémentation chaînée :
Algo longueur(liste L) : retourne un entier
locales : position p
entier l
debut
l <‐ 0
p <‐ L
tant qque pp<>VIDE faire
p <‐ p.suivant
l <‐ l+1
fintantque
retourner l
fin
10
1.2 Implémentation chaînée :
Algo inserer(element e, E/S liste L)
locales :
position p
nouv : adresse d'une cellule
d b
debut
//allouer de la memoire pour une cellule et y mettre e dans le chp valeur
nouv <‐ creer_cellule()
_ ()
nouv.valeur <‐ e
// insertion en tete
nouv suiv <‐ L
nouv.suiv
L <‐ nouv
fi
fin
11
Exemples d'utilisation des listes chainées :
int main()
Déclaration :
{
temp‐>nxt = nouvcell;
if(liste == NULL) return nouvcell;
return liste;
else
} }
15
Exemples d'utilisation des listes chainées :
Rechercher un élément dans une liste
Liste rechercherCellule(Liste liste, int valeur)
{ cellule *tmp=liste;
while(tmp != NULL)
{
if(tmp‐>val == valeur) return tmp;
tmp = tmp‐>nxt;
}
return NULL;
}
16
Exemples d'utilisation des listes chainées :
Rechercher du i‐ème
i ème élément
liste = liste‐>nxt;;
else
return liste;
}
17
Exemples d'utilisation des listes chainées :
Compter le nombre d
d'éléments
éléments d'une
d une liste chaînée
Itérative Récursive
int nombreCellules(Liste liste)
{ int nb = 0; int nombreCellules(Liste
( liste))
cellule* tmp = liste;
{
while(tmp != NULL)
{ if(liste == NULL) return 0;
nb++;
return nombreCellules(liste
nombreCellules(liste‐>nxt)+1;
>nxt)+1;
tmp = tmp‐>nxt;
} }
return nb;
} 18
Exemples d'utilisation des listes chainées :
Compter le nombre d
d'occurrences
occurrences d'une
d une valeur
Itérative
int nombreOccurences(Liste liste, int valeur)
{ int i=0;
if(liste == NULL) return 0;
while((liste = rechercherCellule(liste, valeur)) != NULL)
{
liste = liste‐>nxt;
i++;
}
return i;
}
19
Exemples d'utilisation des listes chainées :
Compter le nombre d
d'occurrences
occurrences d'une
d une valeur
Récursive
int nombreOccurences(Liste liste, int valeur)
20
Exemples d'utilisation des listes chainées :
Supprimer un élément en tête
Liste supprimerCelluleEnTete(Liste liste)
{
if(liste != NULL)
{ cellule* aRenvoyer = liste‐>nxt;
free(liste);
return aRenvoyer;
}
else
return NULL;
}
21
Exemples d'utilisation des listes chainées :
Supprimer un élément en fin de liste
Liste supprimerCelluleEnFin(Liste liste) while(tmp‐>nxt != NULL)
{
{ ptmp = tmp;
if(liste == NULL) return NULL;
if(liste‐>nxt == NULL) tmp = tmp‐>nxt;
{ free(liste);
}
return
t NULL
NULL;
} ptmp‐>nxt = NULL;
free(tmp);
cellule* tmp = liste; return liste;
cellule* ptmp = liste;
}
22
1.2 Types
yp de listes chaînées:
Il existe différents types de listes chaînées telles que :
23
1.2 Types
yp de listes chaînées:
2. Liste chaînée circulaire :
est une liste simplement chainée avec le dernier nœud qui pointe sur le premier (tête de
liste)
24
1.2 Types
yp de listes chaînées:
3. Liste doublement chaînée :
chaque nœud a deux pointeurs,
pointeurs un pointeur précédent qui pointe vers le nœud
précédent et un pointeur suivant pointe vers le nœud suivant(dans le cas du premier
nœud, le pointeur précédent est évidemment NULL et le pointeur suivant du dernier
nœud pointe vers NULL).
type cellule = {
precedent : adresse d'une
d une cellule
valeur : element
suivant : adresse d'une cellule
}
type liste = adresse d'une cellule
25
Comparaison
p des deux implémentations
p
Représentation contiguë :
accès facile au k‐ème élément, mais insertion et suppression longues à cause des décalages.
Problèmes de mémoire à allouer, re‐allouer, etc, lorsque la taille varie.
Représentation chaînée :
pas de longueur
p g fixée ((mais p
plus de mémoire p
prise (p
(place p
pour les p
pointeurs)).
))
Insertion et suppression rapides, mais pas d'accès direct au k‐ème élément.
Conclusion :
ça dépend
dé d de
d ce qu'on
' a à faire,
f i desd primitives
i ii que l'on
l' utilise
ili lel plus
l souvent.
26
Comparaison
p des deux implémentations
p
Ajout/Suppression
Aj t/S i générale
é é l O(N) O(1)
2.1 Définition
éfi i i : Une pile
l est une liste
l l é
linéaire particulière
l è : on ne peut accéder
éd (=( consulter,
l
ajouter, supprimer) qu'au dernier élément, que l'on appelle le sommet de la pile. Dans une
pile, il est impossible d'accéder à un élément au milieu ! Les piles sont aussi appelées
structures LIFO (Last In First Out, c‐a‐d Dernier‐Entré‐Premier‐Sorti).
C'est
C est une structure très utilisée en informatique. Par exemple, les appels de fonctions d
d'un
un
programme utilisent une pile pour sauvegarder toutes les informations (variables, adresse
de ll'instruction
instruction de retour,
retour etc.
etc ).
)
28
2.2 Primitives (PILE) : push & pop
pile créer_pile() : création d'une pile vide
pile créer_pile(entier taille_max ) : création d'une pile vide d'au maximum taille_max
éléments
empiler(element, pile) : met l'élément en sommet de pile, erreur si la taille est limitée et la
pile pleine (push en anglais)
dépiler(pile) : enlève de la pile l'élément en sommet de pile, erreur si la pile est vide
élément dépiler(pile) : enlève l'élément en sommet de pile et le retourne, erreur si la pile
est vide (pop en anglais)
élément sommet(pile) : retourne l'élément en sommet de pile, erreur si la pile est vide
booléen pile_est_vide(pile) : teste si la pile est vide
booléen pile_est_pleine(pile) : teste si la pile est pleine (seulement dans le cas d'une taille
limitée) 29
2.3 Implémentations
2.3.1 Implémentation
p d'une p
pile p
par un tableau :
type pile = { Algorithme sommet(pile P) ; retourne un
element
tab : tableau d
d'elements
elements
debut
s : entier // indice du sommet
si P.s <> 0 alors
}
retourner P.tab[P.s]
Algorithme
g empiler
p ((element e,, E/S
/ ppile p) sinon
debut erreur "on ne peut pas acceder au
sommet d'une pile vide !!"
// si la p
pile n'est p
pas p
pleine !
finsi
p.s <‐ p.s+1
fin
p.tab[p.s]
p [p ] <‐ e
fin
30
2.3 Implémentations
2.3.2 Implémentation
p d'une p
pile p
par une liste chaînée :
type cellule = {
valeur : element
suivant : adresse d'une cellule
}
type pile = {
prem : adresse d'une cellule
sommet : adresse d'une cellule
}
31
2.3 Implémentations
2.3.2 Implémentation
p d'une p
pile p
par une liste chaînée :
Algorithme empiler (element e, E/S pile p)
locales nouv : adresse d
d'une
une cellule sinon
debut // la pile est vide
nouv=creer cellule()
nouv=creer_cellule() p sommet <<‐ nouv
p.sommet
nouv.valeur <‐ e p.prem <‐ nouv
nouv suivant <‐ VIDE
nouv.suivant finsi
// faire les liens fin
si p.sommet
p sommet <> VIDE alors
// la pile n'est pas vide
p sommet suivant <‐ nouv
p.sommet.suivant
p.sommet <‐ nouv
32
2.3 Implémentations
2.3.3 Implémentation
p d'une p
pile p
par une liste chaînée(version2)
( ):
type cellule = { type pile = adresse d'une cellule // le
valeur : element sommet
3.1 Définition
éfi i i :
Une file est une liste linéaire particulière : on ne peut ajouter qu'en queue, consulter qu'en
tête, et supprimer qu'en tête. Comme pour une file d'attente ... !
Les files sont aussi appelées structures FIFO (First In First Out), cad premier‐entré‐premier‐
sorti.
34
3.2 Primitives (FILE) : enqueue & dequeue
type File = {
T : tableau[1..MAX] d'elements
deb : entier
fin : entier
}
36
3.3 Implémentations
3.3.1 Implémentation
p d'une file p
par un tableau :
enfiler(element e,
e E/S file F) defiler(E/S file F)
debut debut
sii F.fin
F fi < MAX alors
l sii F.debut
F d b t <= F.fin
F fi MAX alors
l
F.fin <‐ F.fin +1 F.debut <‐ F.debut +1
F.t[F.fin] <‐ e sinon
sinon erreur "file vide"
file pleine ??? finsi
finsi fin
fin
37
2.3 Implémentations
3.2 Implémentation
p d'une file p
par une liste chaînée :
type cellule = {
valeur : element
suivant : adresse d'une cellule
}
type file {
debut : adresse d'une cellule //la première
fin : adresse d
d'une
une cellule // la dernière
}
38