finalement j’ai bien réussit hier à corriger les soucis, voici le nouveau code :
###################################
##### Implémentation des LDC#######
###################################
def creerListeVide():
"""
Crée une liste vide
:paramètre : None
:return : None
"""
## la liste vide vaut None
return None
def setPrecedent (n, ns):
"""
Mets la liste doublement chainée précendente du noeud dans le noeuds n
:paramètre : n : un noeud
ns : liste doucblement chainée
:return : None
"""
n[1] = ns
def setSuivant (n, ns):
"""
Mets la liste doublement chainée suivante du noeud dans le noeuds n
:paramètre : n : un noeud
ns : liste doucblement chainée suivante
:return : None
"""
n[2] = ns
def creerNoeudLDC(val, precedent, suivant):
"""
Crée un noeud (une liste Python de trois cases) [valeur, noeud présecéent, noeud suivant]
:paramètre : val : valeur du noeud
precedent : contient les noeuds précédent le noeud courant, None si pas de noeud précédent
suivant : contient les noeuds suivant le noeud courant, None si pas de noeud suivant
:return : noeud sous la forme [valeur, noeud présecéent, noeud suivant]
"""
if precedent == None and suivant != None:
return [val, None, suivant]
if precedent != None and suivant == None:
return [val, precedent, None]
if precedent != None and suivant != None:
return [val, precedent, suivant]
else :
return [val, None, None]
def EstNoeudLDC_Precedent(n):
"""
"""
pass
assert (n == None) or (isinstance(n, list) and len(n) == 3 and EstNoeudLDC_Precedent(n[1])) ## Devrait être None ou une liste de 3 éléments [entier, noeudLDC ou None, noeudLDC ou None]
return True
def EstNoeudLDC_Suivant(n):
"""
"""
pass
assert (n == None) or (isinstance(n,list) and len(n)==3 and EstNoeudLDC_Suivant(n[2])) ## Devrait être None ou une liste de 3 éléments [entier, noeudLDC ou None, noeudLDC ou None]
return True
def EstNoeudLDC(n):
"""
"""
pass
assert (n == None) or (EstNoeudLDC_Precedent(n) and EstNoeudLDC_Suivant(n)) ## Devrait être None ou une liste de 3 éléments [entier, noeudLDC ou None, noeudLDC ou None]
return True
def GetValLDC(n):
"""
Permet d'obtenir la valeur du noeud
:paramètre : n : un noeud
:return : la valeur du noeud
"""
assert(n != None) ## on ne peut pas obtenir la valeur d'une liste vide
assert (EstNoeudLDC(n)) ## Doit être un noeud
return n[0]
def GetSuivantLDC(n):
"""
Permet d'obtenir la liste des noeuds suivant
:paramètre : n : un noeud
:return : la liste des noeuds suivant
"""
assert(n != None) ## on ne peut pas obtenir la noeud suivant sur une liste vide
assert (EstNoeudLDC(n)) ## Doit être un noeud
return n[2]
def GetPrecedentLDC(n):
"""
Permet d'obtenir la liste des noeuds précédent
:paramètre : n : un noeud
:return : la liste des noeuds précédent
"""
assert(n != None) ## on ne peut pas obtenir la noeud précédent sur une liste vide
assert (EstNoeudLDC(n)) ## Doit être un noeud
return n[1]
def LongueurLDC(l):
"""
Permet d'obtenir la longeur de la liste doublement chainée
:paramètre : l : liste doublement chainée
:return : int : la valeur de la longeur de la liste
"""
lg = 0
n = l
if l is None :
return lg
else :
lg = 1
while n[2] != None:
lg += 1
n = GetSuivantLDC(n)
return lg
def InsererDebutLDC(l,val):
"""
Permet d'inserer une valeur en début de liste doublement chainée
:paramètre : l : liste doublement chainée
val : valeur du noeud
:return : nn : la nouvelle liste chainée
"""
if l is None:
return creerNoeudLDC(val, None, None)
else:
n = l
while GetPrecedentLDC(n) != None :
n = GetPrecedentLDC(n)
nn = creerNoeudLDC(val, None, n) # l pointe vers le 1er et non vers la tête de la LDC ?
setPrecedent (n,nn)
return nn
def InsererFinLDC(l,val):
"""
Permet d'inserer une valeur en fin de liste doublement chainée
:paramètre : l : liste doublement chainée
val : valeur du noeud
:return : l : la nouvelle liste chainée
"""
if l is None:
return creerNoeudLDC(val, None, None)
else:
## on parcoure la liste jusqu'à atteindre le dernier noeud
n = l
while GetSuivantLDC(n) != None:
n = GetSuivantLDC(n)
## on met à jour le noeud suivant
n[2] = creerNoeudLDC(val, n, None)
m = GetSuivantLDC(l)
p = GetPrecedentLDC(l)
if p != None :
setPrecedent (n, m)
return l
def SupprimerDebutLDC(l):
"""
Permet de supprimer le premier noeud de la liste doublement chainée
:paramètre : l : liste doublement chainée
:return : n : la nouvelle liste chainée
"""
assert(l != None) ## on ne peut pas supprimer un noeud dans une liste vide
n = l
if LongueurLDC(l) == 1:
return None
else :
n = GetSuivantLDC(n)
n[1] = None
return n
def SupprimerFinLDC(l):
"""
Permet de supprimer le dernier noeud de la liste doublement chainée
:paramètre : l : liste doublement chainée
:return : l : la nouvelle liste chainée
"""
assert(l != None) ## on ne peut pas supprimer un noeud dans une liste vide
n = l
if LongueurLDC(l) == 1:
return None
else :
while GetSuivantLDC(n) != None:
n = GetSuivantLDC(n)
setSuivant (GetPrecedentLDC(n), None)
setPrecedent (n, None)
return l
def AccesLDC(l,p):
"""
Permet d'accéder au noeud d'indice p dans la liste doublement chainée l
:paramètre : l : liste doublement chainée
p : int : indice du noeud souhaiter
:return : liste : une liste de 3 éléments avec [la valeur du noeud, noeuds précédents, noeuds suivants]
"""
assert(l != None) ## on ne peut pas accéder à un noeud dans une liste vide
assert p <= LongueurLDC(l) ##L'indice auqu'elle vous souhaitez accéder est trop grand par rapport à la liste
j = 0
m = l
while j < p:
j +=1
m = GetSuivantLDC(m)
return [m[0],m[1],m[2]]
def InsererPlaceLDC(l,val,p):
"""
Permet d'inserer une valeur à la postion p dans la liste doublement chainée l
:paramètre : l : liste doublement chainée
val : valeur du noeud
p : int : indice du noeud souhaiter
:return : l : la nouvelle liste chainée
"""
assert p <= LongueurLDC(l) ##L'indice donnée pour placer la valeur est trop grand par rapport à la liste
if l is None:
return creerNoeudLDC(val, None, None)
elif p == 0 :
InsererDebutLDC(l,val)
elif p == LongueurLDC(l) :
InsererFinLDC(l,val)
else:
j = 0
m = l
while j < p:
j +=1
m = GetSuivantLDC(m)
n = GetPrecedentLDC(m)
nn = creerNoeudLDC(val, m[1], m)
m[1] = nn
n[2] = m[1]
return l
def SupprimerPlaceLDC(l,p):
"""
Permet de supprimer le noeud d'indice p dans la liste doublement chainée l
:paramètre : l : liste doublement chainée
p : int : indice du noeud souhaiter
:return : l : la nouvelle liste chainée
"""
assert(l != None) ## on ne peut pas supprimer à un noeud dans une liste vide
assert p <= (LongueurLDC(l)-1) ##L'indice auqu'elle vous souhaitez supprimer la valeur est trop grand par rapport à la liste
m = l
if p == 0 :
m = SupprimerDebutLDC(l)
elif p == LongueurLDC(l)-1 :
m = SupprimerFinLDC(l)
else:
j = 0
while j < p:
j +=1
m = GetSuivantLDC(m)
n = GetPrecedentLDC(m)
GetSuivantLDC(m)[1] = m[1]
GetPrecedentLDC(m)[2] = m[2]
m[1] = None
m[2] = None
return l
def SupprimerValLDC(l,val):
"""
Permet de supprimer le premier noeud de valeur val dans la liste doublement chainée l
:paramètre : l : liste doublement chainée
val : valeur du noeud à supprimer
:return : n : la nouvelle liste chainée
"""
assert(l != None) ## on ne peut pas supprimer à un noeud dans une liste vide
n = l
j = 0
while GetValLDC(n) != val:
n = GetSuivantLDC(n)
assert(n != None)## la valeur donnée ne ce trouve pas dans la liste
j +=1
n = SupprimerPlaceLDC(l,j)
return n
def LDC2List(l):
"""
Permet de convertir la liste doublement chainée en une liste qui contient toute les valeurs des noeuds
:paramètre : l : liste doublement chainée
:return : List : la liste qui contient toute les valeurs de LDC
"""
long = LongueurLDC(l)
n = l
j = 0
List = []
while j < long :
List.append(GetValLDC(n))
n = GetSuivantLDC(n)
j += 1
return List
def List2LDC(l):
"""
Permet de convertir la liste qui contient la valeurs des noeuds en une liste doublement chainée
:paramètre : l : la liste qui contient toute les valeurs de LDC
:return : list : liste doublement chainée
"""
if l != None :
list = None
for i in range (len(l)) :
list = InsererFinLDC(list, l[i])
else :
assert () ## Ce n'est pas une liste !
return list
#################################
##### Fonction de Test des LDC###
#################################
def est_vide(l):
"""
Permet de testé si une liste l et vide ou non
:paramètre : l : une liste doublement chainée
:return : bool : True si la liste est vide et False si la liste n'est pas vide.
"""
if LongueurLDC(l) == 0:
return True
else :
return False
def test_creation_liste():
"""
Test du Cosntructeur de la liste doublement chainée
:return : bool : True le test est correct
"""
ma_liste = creerListeVide()
assert est_vide(ma_liste)
return True
def test_ajout_tete():
"""
Test de l'ajout d'une valeur en tête de la liste
:return : bool : True le test est correct
"""
ma_liste = creerListeVide()
ma_liste = InsererDebutLDC(ma_liste, 28)
assert not est_vide(ma_liste)
assert LongueurLDC(ma_liste) == 1
return True
def test_ajout_tete_a_fin():
"""
Test de l'ajout d'une valeur en fin de la liste
:return : bool : True le test est correct
"""
ma_liste = creerListeVide()
ma_liste = InsererDebutLDC(ma_liste, 32)
ma_liste = InsererDebutLDC(ma_liste, 14)
ma_liste = InsererFinLDC(ma_liste, 12)
assert LongueurLDC(ma_liste) == 3
return True
##def test_acces_LDC():
## ma_liste = creerListeVide()
## ma_liste = InsererDebutLDC(ma_liste, 32)
## ma_liste = InsererDebutLDC(ma_liste, 14)
## ma_liste = InsererFinLDC(ma_liste, 12)
## Noeud_1 = AccesLDC(ma_liste, 1)
def test_supression_debut():
"""
Test de supression de la tête de la LDC
:return : bool : True le test est correct
"""
ma_liste = creerListeVide()
ma_liste = InsererDebutLDC(ma_liste, 32)
ma_liste = InsererDebutLDC(ma_liste, 14)
ma_liste = InsererFinLDC(ma_liste, 12)
ma_liste = SupprimerDebutLDC(ma_liste) # La LDC est 14, 32, 12
assert LongueurLDC(ma_liste) == 2
assert AccesLDC(ma_liste, 0)[0] == 32
return True
def test_supression_fin():
"""
Test de supression de la fin de la LDC
:return : bool : True le test est correct
"""
ma_liste = creerListeVide()
ma_liste = InsererDebutLDC(ma_liste,32)
ma_liste = InsererDebutLDC(ma_liste,14)
ma_liste = InsererFinLDC(ma_liste,12)
ma_liste = SupprimerFinLDC(ma_liste) # La LDC est 14, 32, 12
assert LongueurLDC(ma_liste) == 2
assert AccesLDC(ma_liste, 2)[0] == 32
return True
def test_ajout_place(val,p):
"""
Test d'ajout une valeur à la place p
:return : bool : True le test est correct
"""
ma_liste = creerListeVide()
ma_liste = InsererDebutLDC(ma_liste, 32)
ma_liste = InsererDebutLDC(ma_liste, 14)
ma_liste = InsererFinLDC(ma_liste, 12)
ma_liste = InsererPlaceLDC(ma_liste, val, p) # La LDC est 14, 32, 12,42
assert LongueurLDC(ma_liste) == 4
assert AccesLDC(ma_liste, p)[0] == val
return True
def test_supression_place():
"""
Test de supression d'un noeud à une place définit
:return : bool : True le test est correct
"""
ma_liste = creerListeVide()
ma_liste = InsererDebutLDC(ma_liste, 32)
ma_liste = InsererDebutLDC(ma_liste, 14)
ma_liste = InsererDebutLDC(ma_liste, 66)
ma_liste = InsererDebutLDC(ma_liste, 33)
ma_liste = SupprimerPlaceLDC(ma_liste, 2) # La LDC est 33, 66, 14, 32 ici on souhiate supprimer 14 le
assert LongueurLDC(ma_liste) == 3
assert AccesLDC(ma_liste, 2)[0] == 32
return True
def test_supression_valeur():
"""
Test de supression d'une valeur dans la LDC
:return : bool : True le test est correct
"""
ma_liste = creerListeVide()
ma_liste = InsererDebutLDC(ma_liste, 32)
ma_liste = InsererDebutLDC(ma_liste, 14)
ma_liste = InsererDebutLDC(ma_liste, 66)
ma_liste = InsererDebutLDC(ma_liste, 33)
ma_liste = SupprimerValLDC(ma_liste, 14) # La LDC est 33, 66, 14, 32 ici on souhiate supprimer 14
assert LongueurLDC(ma_liste) == 3
assert AccesLDC(ma_liste, 2)[0] == 32
return True
def test_LDC_To_List():
"""
Test de Conversion de la LDC en List
:return : bool : True le test est correct
"""
ma_liste = creerListeVide()
ma_liste = InsererDebutLDC(ma_liste, 32)
ma_liste = InsererDebutLDC(ma_liste, 14)
ma_liste = InsererDebutLDC(ma_liste, 66)
ma_liste = InsererDebutLDC(ma_liste, 33)
ma_liste = LDC2List(ma_liste) # La LDC est 33, 66, 14, 32 ici on souhaite la convertir le List [33, 66, 14, 32]
assert ma_liste == [33, 66, 14, 32]
return True
def test_List_To_LDC():
"""
Test de la conversion de la List en LDC
:return : bool : True le test est correct
"""
ma_liste = creerListeVide()
ma_liste = InsererDebutLDC(ma_liste, 32)
ma_liste = InsererDebutLDC(ma_liste, 14)
ma_liste = InsererDebutLDC(ma_liste, 66)
ma_liste = InsererDebutLDC(ma_liste, 33)
ma_liste_test = [33, 66, 14, 32]
ma_liste_test = List2LDC(ma_liste_test)
print("Ma liste : ", ma_liste)
print("Ma liste test : ", ma_liste_test) # La liste est [33, 66, 14, 32] ici on souhiate supprimer 14
assert LongueurLDC(ma_liste_test) == LongueurLDC(ma_liste)
for i in range (LongueurLDC(ma_liste_test)):
assert AccesLDC(ma_liste_test,i) == AccesLDC(ma_liste,i)
return True
##############################################
##### Programme de test des fonction #########
##############################################
if __name__ == '__main__':
print('Test liste vide :', test_creation_liste())
print('Test ajout tête :', test_ajout_tete())
print('Test ajout fin :', test_ajout_tete_a_fin())
print('Test supression début :', test_supression_debut())
print('Test supression fin :', test_supression_debut())
print('Test ajouter à la place :', test_ajout_place(422,2))
print('Test supression Place :', test_supression_place())
print('Test supression Valeur :', test_supression_valeur())
print('Test conversion en List :', test_LDC_To_List())
print('Test conversion en LDC :', test_List_To_LDC())
## print('Test liste acces :', test_acces_LDC())
J’en suis maintenant à essayer les jeux de test pour les fonctions.
Pour test_acces_LDC() j’ai cette erreur :
Traceback (most recent call last):
File "C:\Users\Julie\Downloads\Projet david bloc 3\Fonction_LDC.py", line 511, in <module>
print('Test conversion en LDC :', test_List_To_LDC())
File "C:\Users\Julie\Downloads\Projet david bloc 3\Fonction_LDC.py", line 493, in test_List_To_LDC
assert AccesLDC(ma_liste_test,i) == AccesLDC(ma_liste,i)
RecursionError: maximum recursion depth exceeded in comparison
Mais je ne voit pas comment faire autrement pour automatiser le test ? a moins de l’afficher à l’utilisateur ?