Académique Documents
Professionnel Documents
Culture Documents
Les structures des données permettent de stocker des données temporairement dans la mémoire
centrale durant l’exécution d’un programme.
Dans ce chapitre, on va aborder deux types de structures de données :
Linéaire : liste, Pile, File, Liste simplement chaînée et doublement chaînées.
Non Linéaire : arbres , graphes.
1 Recherche dichotomique
Pour rechercher un nombre dans un tableau ou liste triés par ordre croissant, le principe de
dichotomie consiste à couper ce tableau en deux, à chercher dans une partie et si ce n’est dans
celle-ci, alors nous cherchons dans l’autre et ainsi de suite jusqu’à la fin. Nous nous arrêtons
quand la valeur a été trouvée ou bien lorsque nous sommes arrivé à la fin du tableau c.à.d.
quand la valeur recherchée n’est pas dans le tableau.
Exercice :
Écrire le programme en python.
3 Les piles
Une pile c’est une structure qui suit le principe du dernier arrivé premier servi, en anglais
Last In First Out (LIFO). En Python, on peut implémenter une pile en utilisant une liste de
taille fixe.
1
...
...
...
...
→
Top = -1
...
13
9
2
def pop() :
global tpos
if tpos==-1 :
print("Pile vide")
item = None
else :
item = pile[tpos]
tpos= tpos-1
return item
Exercice 1 : Créer une pile avec une taille non limitée
Exercice 2 : Utiliser la notion de piles pour renverser texte entrer au clavier.
4 Les Files
Une file est une structure qui suit le principe du premier arrivé premier servi, en anglais
First In First Out (FIFO). En Python, on peut implémenter une Pile en utilisant une liste de
taille fixe.
Une file est caractérisée par une tête et une queue. le nouvel élément est toujours inséré à la
queue et on ne peut supprimé que l’élément qui se trouve à la tête.
Opération sur une files :
Enfiler : insérer un élément. Défiler : supprimé un élément.
2
4.1 Implémentation d’une file avec une liste
On va utiliser une liste pour stocker les éléments de la file.
Initialement la file est vide : queue = tete = −1
Lorsqu’on enfile un nouveau élément on incrémente queue, si queue! = n − 1.
Lorsqu’on défile un élément, on incrémente tete si queu! = −1.
Pour la première effilement, queue et tete sont toutes les deux incrémentées et valent 0.
Dans le cas où queue = tete, si on supprime un élément, alors queue = tete = −1
queue=tete=-1
listeQueue=[]
taille=10
def push(element) :
global listeQueue
global queue
global tete
if queue== taille-1 :
print("File pleine")
elif queue==tete==-1 :
listeQueue = listeQueue + [element]
queue =tete= 0
else :
listeQueue = listeQueue + [element]
queue+=1
def pop() :
global listeQueue
global queue
global tete
if tete==-1 :
return None
elif tete==queue :
item = listeQueue[0]
tete=queue = -1
listeQueue=[]
return item
else :
item = listeQueue[0]
listeQueue = listeQueue[1 : queue-tete + 1]
tete += 1
return item
5 Listes chaînées
5.1 Listes chaînées simple
c’est une collection de nœuds dans laquelle chaque nœud contient la donnée et une référence
de l"élément suivant.
3
5.2 Implémentation d’une liste chaînée simple.
Classe node avec un constructeur pour créer des nœud avec deux attribues :
data : représente la valeur stocké dans le nœud.
next : représente la référence de l’élément suivant. Par défaut, next est nulle.
Classe linkedList représente chaîne un attribue head est la tête de la liste chaînée simple
construteur,
Ajouter à la fin
Ajouter au début,
Ajouter après un élément de la liste
Ajouter avant un élément de la liste
chercher un élément
Modifier un élément
Supprimer un élément
class node :
def __init__(self,data,next=None) :
self.data = data
self.next = next
class linkedlist :
def __init__(self) :
self.head=None
# Ajouter à la fin de la liste.
def addelement(self, data) :
newEle = node(data)
if self.head != None :
curent= self.head
while curent.next !=None :
curent=curent.next
curent.next=newEle
else :
self.head = newEle
# Ajouter un nœud après un élément donné
def addafter(self,data,ele) :
newEle = node(data)
if ele == None :
pass
elif self.head != None :
curent = self.head
while curent.next != None :
if curent == ele :
break
curent = curent.next
newEle.next = curent.next
curent.next = newEle
else :
self.head = newEle
4
if ele== None :
pass
elif self.head == None :
self.head=newEle
elif ele == self.head :
newEle.next=self.head
self.head=newEle
else :
curent=self.head
previous=self.head
while curent :
if curent.next == ele :
break
previous =curent
curent=curent.next
newEle.next=curent
previous.next= newEle
# Supprimer un élément.
def delet(self, ele) :
if ele == None :
pass
elif self.head == None :
pass
elif self.head==ele :
self.head=self.head.next
else :
curent=self.head.next
previous=self.head
while curent != ele and curent.next :
previous= previous.next
curent = curent.next
if curent==ele :
previous.next=curent.next
curent.next=None
# Mettre à jour d’une valeur d’un element donnée.
def update(self,newData, ele) :
if not (ele and self.head) :
pass
else :
curent = self.head
while curent.next and curent !=ele :
curent=curent.next
if curent==ele :
curent.data=newData
5
self.data = data
self.next = next
class pile :
def __init__(self) :
self.top= None
def push(self, data) :
newEle=node(data, None)
newEle.next =self.top
self.top= newEle
def pop(self) :
if not self.top :
raise Exception("La pile est vide")
rst=self.top
self.top = self.top.next
return rst
def showPile(self) :
curent =self.top
while curent :
print(curent.data)
curent = curent.next
6
5.3 Listes doublement chinées
C’est une collection de nœuds dans laquelle chaque nœud contient la donnée, une référence
de L’élément suivant et une référence de l’élément précédent.
Exercice : En suivant les même techniques utiliser précédemment, implémenter une liste
doublement chaînée.
7
level2child2 = Node(50, parent=level1child2)