diff --git a/algo_avancee/listes.html b/algo_avancee/listes.html new file mode 100644 index 0000000..0e6bd8b --- /dev/null +++ b/algo_avancee/listes.html @@ -0,0 +1,1311 @@ + + +listes

Algo avancée - Listes

+

Problématique

+

Les tableaux ont une taille fixe. Ce n’est pas intéressant pour des volumes variables de données. En effet, l’espace mémoire est une ressource. Et il ne faut pas gaspiller les ressources.
+L’idée est de trouver une manière dynamique de demander de l’espace mémoire en fonction des données à stocker. Le problème est qu’on a plus de lien entre les cases. Il faut alors également réserver de l’espace dans la “case” pour le chaînage (quel est l’élément suivant).
+Cette structure de données correspond aux listes.

+

L’avantage des listes est son dynamisme. Son inconvénient est la lenteur de l’accès aux données (on est obligés de passer par la tête de la liste puis par toutes les cases suivantes pour accéder à une valeur).

+

Exercices

+

Écrire un algo de création de LLC (Liste Linéaire Chaînée) avec des valeurs saisies par l’utilisateur.

+
def creationliste(nbval):
+    """
+    : declaration
+    :   ptr : Maillon
+    :   cpt, val : int
+    : entrée nbval : int
+    : sortie tete : Maillon
+    : Précondition
+    :   nbval > 0
+    """
+    #Début
+    cpt = 0
+    for cpt in range(nbval):
+        print("valeur n°", cpt)
+        val = int(input())
+
+        if cpt == 0:
+            tete = Maillon()
+            tete.val = val
+            ptr = tete
+        else:
+            ptr.suivant = Maillon()
+            ptr = ptr.suivant
+            ptr.val = val
+        #endif
+    #endfor
+
+    ptr.suivant = None
+    return(tete)
+    #Fin
+
+ +

Écrire deux algos de recherche dans une liste : booléen en sortie et maillon en sortie

+
def recherche_booleen(tete, valeur):
+    """
+    : declaration
+    :   ptr : Maillon
+    : entrées
+    :   tete : Maillon
+    :   valeur : X
+    """
+    # Début
+    ptr = tete
+    while ptr is not None:
+        if ptr.val == valeur:
+            return True
+        ptr = ptr.suivant
+    # endwhile
+    return False
+    # Fin
+
+ +
def recherche_maillon(tete, valeur):
+    """
+    : entrées
+    :   tete : Maillon
+    :   valeur : X
+    : sortie
+    :   ptr : Maillon
+    """
+    # Début
+    ptr = tete
+    while ptr is not None:
+        if ptr.val == valeur:
+            return ptr
+        ptr = ptr.suivant
+    # endwhile
+    return None
+    # Fin
+
+ +

Écrire un algo qui compte le nombre d’éléments dans une liste

+
def compte(tete):
+    """
+    : entrées
+    :   tete : Maillon
+    : sortie
+    :   compte : int
+    """
+    # Début
+    ptr = tete
+    compte = 0
+    while ptr is not None:
+        compte += 1
+        ptr = ptr.suivant
+    # endwhile
+    return compte
+    # Fin
+
+ +
def insereTrie(tete, maillon):
+    """
+    : entrées
+    :   tete : Maillon
+    :   maillon : Maillon
+    """
+    # Début
+    if tete is None:
+        tete = maillon
+    else:
+        trouve = False
+        if maillon.val <= tete.val:
+            maillon.suivant = tete
+            tete = maillon
+            trouve = True
+        # endif
+
+        if not trouve:
+            ptr = tete
+            while ptr.suivant is not None and not trouve:
+                if maillon.val <= ptr.suivant.val and maillon.val >= ptr.val:
+                    trouve = True
+                    maillon.suivant = ptr.suivant
+                    ptr.suivant = maillon
+                ptr = ptr.suivant
+            # endwhile
+            if not trouve:
+                ptr.suivant = maillon
+        # endif
+    # endif
+    # Fin
+
+ +
def supprimer(tete, valeur):
+    """
+    : entrées
+    :   tete : Maillon
+    :   valeur : X
+    """
+    # Début
+    if tete is not None:
+        ptr = tete
+        precedent = None
+        trouve = False
+        if tete.val == valeur:
+            trouve = True
+        while ptr.suivant is not None and not trouve:
+            precedent = ptr
+            if ptr.suivant.val == valeur:
+                trouve = True
+            ptr = ptr.suivant
+        # endwhile
+        if (not trouve and ptr.val == valeur) or trouve:
+            precedent.suivant = ptr.suivant
+            free(ptr)
+    # endif
+    # Fin
+
+ +
def combiner(tete1, tete2):
+    """
+    : entrées
+    :   tete1, tete2 : Maillon
+    : precondition :
+    : Les deux listes sont triées
+    """
+    # Début
+    if not tete1:
+        return tete2
+    elif not tete2:
+        return tete1
+    # endif
+
+    tete3 = Maillon()
+    tete3.val = tete1.val if tete1.val <= tete2.val else tete2.val
+    tete3.suivant = None
+    ptr1, ptr2, ptr3 = tete1, tete2, tete3
+    while ptr1 or ptr2:
+        ptr3.suivant = Maillon()
+        if not ptr2 and ptr1:
+            ptr3.suivant.val = ptr1.val
+            ptr1 = ptr1.suivant
+        elif not ptr1:
+            ptr3.suivant.val = ptr2.val
+            ptr2 = ptr2.suivant
+        else:
+            if (ptr1.val <= ptr2.val):
+                ptr3.suivant.val = ptr1.val
+                ptr1 = ptr1.suivant
+            else:
+                ptr3.suivant.val = ptr2.val
+                ptr2 = ptr2.suivant
+            # endif
+        # endif
+    # endwhile
+    return tete3
+    # Fin
+
+ +
def autreCombiner(tete1, tete2):
+    """
+    : entrées
+    :   tete1, tete2 : Maillon
+    : precondition :
+    : Les deux listes sont triées
+    """
+    # Début
+    if not tete1:
+        return tete2
+    elif not tete2:
+        return tete1
+    # endif
+
+    tete3 = Maillon()
+    tete3.val = tete1.val
+    tete3.suivant = None
+    ptr1, ptr2, ptr3 = tete1, tete2, tete3
+
+    # On copie la liste 1 dans celle qu'on retourne.
+    while ptr1:
+        ptr3.suivant = Maillon()
+        ptr3.suivant.val = ptr1.val
+        ptr1 = ptr1.suivant
+        ptr3 = ptr3.suivant
+    # endwhile
+
+    # On utilise l'algo précédemment écrit pour insérer la deuxième.
+    while ptr2:
+        insereTrie(tete3, ptr2)
+        ptr2 = ptr2.suivant
+    # endwhile
+
+    return tete3
+
+ +

Éclater une liste en deux listes contenant les nombres pairs et impairs.
+

def autreCombiner(tete1, tete2):
+    """
+    : entrées
+    :   tete1, tete2 : Maillon
+    : precondition :
+    : Les deux listes sont triées
+    """
+    # Début
+    if not tete1:
+        return tete2
+    elif not tete2:
+        return tete1
+    # endif
+
+    tete3 = Maillon()
+    tete3.val = tete1.val
+    tete3.suivant = None
+    ptr1, ptr2, ptr3 = tete1, tete2, tete3
+
+    # On copie la liste 1 dans celle qu'on retourne.
+    while ptr1:
+        ptr3.suivant = Maillon()
+        ptr3.suivant.val = ptr1.val
+        ptr1 = ptr1.suivant
+        ptr3 = ptr3.suivant
+    # endwhile
+
+    # On utilise l'algo précédemment écrit pour insérer la deuxième.
+    while ptr2:
+        insereTrie(tete3, ptr2)
+        ptr2 = ptr2.suivant
+    # endwhile
+
+    return tete3
+

\ No newline at end of file diff --git a/algo_avancee/listes.md b/algo_avancee/listes.md index 8537654..284a00b 100644 --- a/algo_avancee/listes.md +++ b/algo_avancee/listes.md @@ -244,4 +244,42 @@ def autreCombiner(tete1, tete2): return tete3 ``` +Éclater une liste en deux listes contenant les nombres pairs et impairs. +```python +def autreCombiner(tete1, tete2): + """ + : entrées + : tete1, tete2 : Maillon + : precondition : + : Les deux listes sont triées + """ + # Début + if not tete1: + return tete2 + elif not tete2: + return tete1 + # endif + + tete3 = Maillon() + tete3.val = tete1.val + tete3.suivant = None + ptr1, ptr2, ptr3 = tete1, tete2, tete3 + + # On copie la liste 1 dans celle qu'on retourne. + while ptr1: + ptr3.suivant = Maillon() + ptr3.suivant.val = ptr1.val + ptr1 = ptr1.suivant + ptr3 = ptr3.suivant + # endwhile + + # On utilise l'algo précédemment écrit pour insérer la deuxième. + while ptr2: + insereTrie(tete3, ptr2) + ptr2 = ptr2.suivant + # endwhile + + return tete3 +``` +