TD1 Les listes chaînées - FR

publicité
TD no 1 (corrigé)
ESIEE IGI-3005
2016-2017
Les listes chaînées (corrigé)
Tous les exercices sont à faire.
Pas de compte-rendu obligatoire.
Le compte-rendu du TP suivant en tiendra lieu.
1
Implémentation de liste chaînée en tableau
1.1
Principe
Une liste chaînée peut être représentée par deux tableaux, l’un (contenu) contenant des
valeurs et l’autre (suivant) contenant des indices. Le chaînage sera effectué de la façon suivante :
l’élément suivant contenu[k] aura suivant[k] comme indice dans le tableau contenu.
La liste sera l’indice dans le tableau contenu du premier élément. L’élément situé en fin de
liste sera associé à une valeur spéciale dans le tableau suivant (-1 par exemple).
Ainsi, la liste :
'q'
't'
lst
'w'
'r'
peut être représentée par :
'e'
lst
0
1
2
3
4
2
contenu
'q'
'w'
'e'
'r'
't'
suivant
3
-1
0
4
1
La valeur de la tête de liste (lst) est l’élément no 2 du tableau contenu ('e'). Le suivant est
l’élément no 0 ('q') et ainsi de suite jusqu’au dernier élément 'w' associé à -1 indiquant la fin de
la liste.
Pour afficher la liste, on pourra utiliser l’algorithme suivant :
Algorithme - Affichage itératif d’une liste
parcours de liste représentée par tableau
itération sur les éléments de tableau à partir de la tête
PROCÉDURE affichageListeIteratif
DONNÉES
: lst ∈ ENT // la tête de la liste
DONNÉES
: contenu ∈ TAB de CAR , suivant ∈ TAB de ENT
p
lst
TANT QUE p 6= -1 FAIRE
afficher (contenu[p])
p
suivant[p]
FIN TANT QUE
FIN PROCÉDURE
–1/15–
TD no 1 (corrigé)
ESIEE IGI-3005
2016-2017
Exercice 1. Écrire l’algorithme récursif de parcours de cette liste
Algorithme à écrire 1 - Affichage récursif d’une liste
parcours de liste représentée par tableau
affichage de la tête, affichage récursif de la suite
PROCÉDURE affichageListeRécursif
DONNÉES
: lst ∈ ENT
DONNÉES
: contenu ∈ TAB de CAR , suivant ∈ TAB de ENT
...
FIN PROCÉDURE
Corrigé
***************************************************************************
Algorithme - Affichage récursif d’une liste
parcours de liste représentée par tableau
affichage de la tête, affichage récursif de la suite
PROCÉDURE affichageListeRecursif
DONNÉES
: lst ∈ ENT
DONNÉES
: contenu ∈ TAB de CAR , suivant ∈ TAB de ENT
SI lst 6= -1 ALORS
afficher (contenu[lst])
affichageListeRecursif(suivant[lst])
FIN SI
FIN PROCÉDURE
***************************************************************************
1.2
Ajout d’un élément en tête de liste
Soit la liste suivante :
lst
2
Mémoire de gestion de liste
contenu suivant
0
'q'
3
1
'w'
-1
2
'e'
0
3
'r'
4
4
't'
1
Si on ajoute un élément (par exemple 'a') en tête de liste, il faudra :
– le placer dans le tableau contenu (en dernière position)
– le chaîner à l’ancienne tête de liste
– modifier la valeur de lst pour qu’elle indique ce nouvel élément.
–2/15–
TD no 1 (corrigé)
ESIEE IGI-3005
2016-2017
Exercice 2. Faire un schéma de la configuration après insertion de 'a' en tête de liste
Corrigé
***************************************************************************
lst
5
Mémoire de gestion de liste
contenu suivant
0
'q'
3
1
'w'
-1
2
'e'
0
3
'r'
4
4
't'
1
5
'a'
2
***************************************************************************
Pour écrire l’algorithme, il est nécessaire d’avoir un marqueur indiquant la position du tableau
à laquelle une insertion peut se faire (première position non occupée) :
Mémoire de gestion de liste
libre 5
lst
2
0
1
2
3
4
contenu
'q'
'w'
'e'
'r'
't'
suivant
3
-1
0
4
1
Exercice 3. Écrire l’algorithme de la procédure permettant d’insérer un nouvel élément
en tête de liste
C’est une procédure qui est demandée. La donnée indiquant la tête de liste doit donc être
modifiable. D’autre part, on ne se préoccupera pas de la taille réelle du tableau (considéré comme
infini)
Algorithme à écrire 2 - Insertion en tête de liste
PROCÉDURE insereEnTete
DONNÉES
: c ∈ CAR
DONN. MOD. : lst ∈ ENT
DONN. MOD. : contenu ∈ TAB de CAR , suivant ∈ TAB de ENT
DONN. MOD. : libre ∈ ENT
...
FIN PROCÉDURE
Corrigé
***************************************************************************
–3/15–
ESIEE IGI-3005
TD no 1 (corrigé)
2016-2017
Algorithme - Insertion en tête de liste
PROCÉDURE insereEnTete
DONNÉES
: c ∈ CAR
DONN. MOD. : lst ∈ ENT
DONN. MOD. : contenu ∈ TAB de CAR , suivant ∈ TAB de ENT
DONN. MOD. : libre ∈ ENT
contenu[libre]
c
suivant[libre]
lst
lst
libre
libre
libre + 1
FIN PROCÉDURE
***************************************************************************
1.3
Vider la liste
Cette opération est simple : il suffit d’indiquer que le premier emplacement libre est l’élément no 0 et mettre lst à une valeur impossible (-1). Il n’est pas nécessaire de remettre à 0 les
contenus des tableaux.
Exercice 4. Écrire l’algorithme de la procédure permettant de vider la liste et faire un
schéma de la configuration après remise à zéro de la liste
Algorithme à écrire 3
PROCÉDURE raz
DONN. MOD. : lst ∈ ENT
DONN. MOD. : libre ∈ ENT
...
FIN PROCÉDURE
Corrigé
***************************************************************************
Algorithme
PROCÉDURE raz
DONN. MOD. : lst ∈ ENT
DONN. MOD. : libre ∈ ENT
lst
-1
0
libre
FIN PROCÉDURE
–4/15–
TD no 1 (corrigé)
ESIEE IGI-3005
2016-2017
Mémoire de gestion de liste
libre 0
lst
-1
0
1
2
3
4
5
contenu
'q'
'w'
'e'
'r'
't'
'a'
suivant
3
-1
0
4
1
2
***************************************************************************
1.4
Autres opérations
Maintenir un tri sur la liste, supprimer des éléments de la liste sont des opérations possibles.
Mais si les ajouts se font systématiquement en fin de tableau, les suppressions créeront des trous
irrécupérables. La suite du TD propose une solution utilisant une liste des places libres pour
accéder aux emplacements non occupés.
2
Gestion par liste des emplacements libres
Une liste chaînée particulière permettra d’accéder aux emplacements libres.
– ajouter un élément à une liste consistera à enlever un élément de la liste des places libres
et pour l’inclure dans la liste modifiée ;
– supprimer un élément d’une liste consistera à l’enlever de la liste active et l’ajouter à la
liste des places libres.
2.1
Représentation mémoire
Exercice 5. À partir de la configuration initiale représentée ci-dessous, dessiner les configurations après chacune les opérations indiquées
Mémoire de gestion de liste
libre 0
lst
-1
0
1
2
3
4
5
contenu
?
?
?
?
?
?
suivant
1
2
3
4
5
-1
La liste lst est vide (-1). Les éléments de tableaux disponibles sont eux mêmes dans une liste
chaînée libre commençant en 0.
–5/15–
TD no 1 (corrigé)
ESIEE IGI-3005
–
–
–
–
–
–
2016-2017
ajouter '2' en tête de liste ;
ajouter 'x' en tête de liste ;
ajouter 'T' en tête de liste ;
supprimer 'x' de la liste ;
ajouter 'S' en tête de liste ;
ajouter '0' après 'T'.
Corrigé
***************************************************************************
Mémoire de gestion de liste
libre 1
Ajouter '2' en tête de liste
lst
0
0
1
2
3
4
5
contenu
'2'
?
?
?
?
?
suivant
-1
2
3
4
5
-1
Mémoire de gestion de liste
libre 2
Ajouter 'x' en tête de liste
lst
1
0
1
2
3
4
5
contenu
'2'’
'x'
?
?
?
?
suivant
-1
0
3
4
5
-1
Mémoire de gestion de liste
libre 3
Ajouter 'T' en tête de liste
lst
2
0
1
2
3
4
5
–6/15–
contenu
'2'
'x'
'T'
?
?
?
suivant
-1
0
1
4
5
-1
TD no 1 (corrigé)
ESIEE IGI-3005
2016-2017
Mémoire de gestion de liste
libre 1
Supprimer 'x' de la liste
0
1
2
3
4
5
2
lst
contenu
'2'
'x'
'T'
?
?
?
suivant
-1
3
0
4
5
-1
Mémoire de gestion de liste
libre 3
Ajouter 'S' en tête de liste
lst
0
1
2
3
4
5
1
contenu
'2'
'S'
'T'
?
?
?
suivant
-1
2
0
4
5
-1
Mémoire de gestion de liste
libre 4
Ajouter '0' après 'T'
lst
1
0
1
2
3
4
5
contenu
'2'
'S'
'T'
'0'
?
?
suivant
-1
2
3
0
5
-1
***************************************************************************
2.2
Initialisation de la mémoire de gestion de liste
On notera T la taille des tableaux contenu et suivant.
Exercice 6. Écrire l’algorithme d’initialisation permettant d’obtenir la configuration suivante :
–7/15–
TD no 1 (corrigé)
ESIEE IGI-3005
2016-2017
Mémoire de gestion de liste
libre 0
0
1
2
3
4
5
contenu
?
?
?
?
?
?
suivant
1
2
3
4
5
-1
Algorithme à écrire 4 - Initialisation de la mémoire de gestion de liste
initialise le tableau suivant en chaînant chaque élément à son suivant, le dernier étant chaîné
à -1. Initialise la chaîne libre à 0
itération classique
PROCÉDURE init
DONN. MOD. : suivant ∈ TAB de ENT
DONN. MOD. : libre ∈ ENT
DONNÉES
: T ∈ ENT
....
FIN PROCÉDURE
Corrigé
***************************************************************************
Algorithme - Initialisation de la mémoire de gestion de liste
initialise le tableau suivant en chaînant chaque élément à son suivant, le dernier étant chaîné
à -1. Initialise la chaîne libre à 0
itération classique
PROCÉDURE init
DONN. MOD. : suivant ∈ TAB de ENT
DONN. MOD. : libre ∈ ENT
DONNÉES
: T ∈ ENT
i
0
TANT QUE i < T FAIRE
suivant[i]
i + 1
i
i + 1
FIN TANT QUE
-1
suivant[T - 1]
libre
0
FIN PROCÉDURE
***************************************************************************
2.3
Allocation d’une place libre
Demander une place pour écrire un nouvel élément nécessite de consulter la liste des places
libres et retourner une place libre (le plus simple étant d’en retourner la tête de liste). Il conviendra
de supprimer cette place de la liste des places libres.
–8/15–
ESIEE IGI-3005
TD no 1 (corrigé)
2016-2017
Exercice 7. Écrire l’algorithme d’allocation de place
Algorithme à écrire 5 - Réservation d’une place dans le tableau
retourne le no du premier élément libre du tableau et met à jour la tête de liste des éléments
libres
FONCTION allouePlace
DONN. MOD. : suivant ∈ TAB de ENT
DONN. MOD. : libre ∈ ENT
RÉSULTAT
: ENT
....
FIN FONCTION
Corrigé
***************************************************************************
Algorithme - Réservation d’une place dans le tableau
retourne le no du premier élément libre du tableau et met à jour la tête de liste des éléments
libres
FONCTION allouePlace
DONN. MOD. : suivant ∈ TAB de ENT
DONN. MOD. : libre ∈ ENT
RÉSULTAT
: ENT
SI libre = -1 ALORS
RETOUR
-1 // allocation impossible
SINON
n
libre
libre
suivant[n]
RETOUR
n
FIN SI
FIN FONCTION
***************************************************************************
2.4
Libération d’une place occupée
De même, si on ne désire plus se servir d’une place, il conviendra de l’ajouter à la liste des
places libres place pour la rendre disponible en cas de nouvelle allocation.
Exercice 8. Écrire l’algorithme de libération d’une place occupée
Algorithme à écrire 6 - Libération d’une place occupée
ajoute le no indiqué à la liste des éléments libres
PROCÉDURE liberePlace
DONNÉES
: n ∈ ENT
DONN. MOD. : suivant ∈ TAB de ENT
DONN. MOD. : libre ∈ ENT
....
FIN PROCÉDURE
–9/15–
TD no 1 (corrigé)
ESIEE IGI-3005
2016-2017
Corrigé
***************************************************************************
Algorithme - Libération d’une place occupée
ajoute le no indiqué à la liste des éléments libres
PROCÉDURE liberePlace
DONNÉES
: n ∈ ENT
DONN. MOD. : suivant ∈ TAB de ENT
DONN. MOD. : libre ∈ ENT
suivant[n]
libre
n
FIN PROCÉDURE
libre
***************************************************************************
2.5
Insertion en tête de liste
Exercice 9. Écrire l’algorithme de la fonction qui ajoute un caractère en tête de liste
Algorithme à écrire 7 - Insertion en tête de liste
insère le caractère c dans une liste. Retourne la valeur de la nouvelle tête de liste
alloue une place, la remplit, la chaîne sur l’ancienne tête de liste, retourne le numéro de place
alloué
FONCTION insereEnTete
DONNÉES
: tete ∈ ENT , c ∈ CAR
DONN. MOD. : contenu ∈ TAB de CAR , suivant ∈ TAB de ENT
DONN. MOD. : libre ∈ ENT
RÉSULTAT
: ENT
...
FIN FONCTION
Corrigé
***************************************************************************
Algorithme - Insertion en tête de liste
insère le caractère c dans une liste. Retourne la valeur de la nouvelle tête de liste
alloue une place, la remplit, la chaîne sur l’ancienne tête de liste, retourne le numéro de place
alloué
FONCTION insereEnTete
DONNÉES
: tete ∈ ENT , c ∈ CAR
DONN. MOD. : contenu ∈ TAB de CAR , suivant ∈ TAB de ENT
DONN. MOD. : libre ∈ ENT
RÉSULTAT
: ENT
allouePlace(suivant, libre)
m
suivant[m]
tete
contenu[m]
c
RETOUR
m
FIN FONCTION
–10/15–
ESIEE IGI-3005
TD no 1 (corrigé)
2016-2017
***************************************************************************
2.6
Suppression de la tête de liste
Exercice 10. Écrire l’algorithme de la fonction qui supprime la tête d’une liste
On suppposera la liste non vide.
Algorithme à écrire 8 - Suppression de la tête de liste
Supprime le premier élément d’une liste et retourne la valeur de la nouvelle tête de liste
libère la place de l’élément de tête et retourne la place de l’élément suivant
FONCTION supprimeTete
DONNÉES
: tete ∈ ENT
DONN. MOD. : suivant ∈ TAB de ENT
DONN. MOD. : libre ∈ ENT
RÉSULTAT
: ENT
...
FIN FONCTION
Corrigé
***************************************************************************
Algorithme - Suppression de la tête de liste
Supprime le premier élément d’une liste et retourne la valeur de la nouvelle tête de liste
libère la place de l’élément de tête et retourne la place de l’élément suivant
FONCTION supprimeTete
DONNÉES
: tete ∈ ENT
DONN. MOD. : suivant ∈ TAB de ENT
DONN. MOD. : libre ∈ ENT
RÉSULTAT
: ENT
suivant[tete]
m
liberePlace(tete, suivant, libre)
RETOUR
m
FIN FONCTION
***************************************************************************
2.7
Initialisation d’une liste
Une liste devra être initialisée. C’est simplement la mise à -1 de la valeur de l’entier correspondant à la liste.
Attention : l’initialisation d’une liste (première utilisation) ne doit pas être confondue avec
la remise à zéro d’une liste existante (libération)
–11/15–
ESIEE IGI-3005
TD no 1 (corrigé)
2016-2017
Exercice 11. Écrire l’algorithme de la fonction qui initialise une liste
On suppposera la liste non encore utilisée.
Algorithme à écrire 9 - Initialisation de la liste
Retourne -1
FONCTION initListe
RÉSULTAT
: ENT
...
FIN FONCTION
Corrigé
***************************************************************************
Algorithme - Initialisation de la liste
Retourne -1
FONCTION initListe
RÉSULTAT
: ENT
RETOUR
-1
FIN FONCTION
***************************************************************************
2.8
Remise à zéro de la liste (libération)
En fin d’utilisation, il faut prévoir de vider la liste pour rendre la mémoire utilisée. C’est le
rôle de la libération de la liste.
Attention : la libération d’une liste (après utilisation) ne doit pas être confondue avec
l’initialisation d’une nouvelle liste.
Exercice 12. Écrire l’algorithme de la procédure qui libère une une liste existante
Algorithme à écrire 10 - Libération d’une liste
Désalloue chaque place de la liste
libération récursive
PROCÉDURE libereListe
DONNÉES
: tete ∈ ENT
DONN. MOD. : suivant ∈ TAB de ENT
DONN. MOD. : libre ∈ ENT
...
FIN PROCÉDURE
Corrigé
***************************************************************************
–12/15–
ESIEE IGI-3005
TD no 1 (corrigé)
2016-2017
Algorithme - Libération d’une liste
Désalloue chaque place de la liste
libération récursive
PROCÉDURE libereListe
DONNÉES
: tete ∈ ENT
DONN. MOD. : suivant ∈ TAB de ENT
DONN. MOD. : libre ∈ ENT
SI tete 6= -1 ALORS
libereListe(suivant[tete], suivant, libre)
liberePlace(tete, suivant, libre)
FIN SI
FIN PROCÉDURE
***************************************************************************
2.9
Insertion dans une liste triée
Exercice 13. Écrire l’algorithme de la fonction qui ajoute un caractère dans une liste triée
Algorithme à écrire 11 - Insertion dans une liste triée
insère un caractère c dans une liste triée. Retourne la valeur de la nouvelle tête de liste
Algo récursif. Si la liste est vide ou si l’élément à insérer est inférieur à l’élément en tête de
liste, on insère en tête, sinon on appelle récursivement l’insertion triée sur le suivant de la tête
de liste.
FONCTION insereTrie
DONNÉES
: tete ∈ ENT , c ∈ CAR
DONN. MOD. : contenu ∈ TAB de CAR , suivant ∈ TAB de ENT
DONN. MOD. : libre ∈ ENT
RÉSULTAT
: ENT
...
FIN PROCÉDURE
Corrigé
***************************************************************************
–13/15–
ESIEE IGI-3005
TD no 1 (corrigé)
2016-2017
Algorithme - Insertion dans une liste triée
insère un caractère c dans une liste triée. Retourne la valeur de la nouvelle tête de liste
Algo récursif. Si la liste est vide ou si l’élément à insérer est inférieur à l’élément en tête de
liste, on insère en tête, sinon on appelle récursivement l’insertion triée sur le suivant de la tête
de liste.
FONCTION insereTrie
DONNÉES
: tete ∈ ENT , c ∈ CAR
DONN. MOD. : contenu ∈ TAB de CAR , suivant ∈ TAB de ENT
DONN. MOD. : libre ∈ ENT
RÉSULTAT
: ENT
SI tete = -1 ou c ≤ contenu[tete] ALORS
RETOUR
insereEnTete(tete, c, contenu, suivant, libre)
SINON
suivant[tete]
insereTrie(suivant[tete], c, contenu, suivant, libre)
tete
RETOUR
FIN SI
FIN PROCÉDURE
***************************************************************************
2.10
Suppression dans une liste triée
Exercice 14. Écrire l’algorithme de la fonction qui supprime un caractère dans une liste
triée
Algorithme à écrire 12 - Suppression dans une liste triée
supprime un caractère c dans une liste triée. Retourne la valeur de la nouvelle tête de liste
Algo récursif. Si la liste est vide ou si l’élément à supprimer est inférieur à l’élément en tête de
liste, on ne fait rien, sinon si l’élément à supprimer est égal à la tete de liste, on supprime en
tête, sinon on appelle récursivement la suppression sur le suivant de la tête de liste.
FONCTION supprimeTrie
DONNÉES
: tete ∈ ENT , c ∈ CAR
DONNÉES
: contenu ∈ TAB de CAR
DONN. MOD. : suivant ∈ TAB de ENT
DONN. MOD. : libre ∈ ENT
RÉSULTAT
: ENT
...
FIN PROCÉDURE
Corrigé
***************************************************************************
–14/15–
ESIEE IGI-3005
TD no 1 (corrigé)
2016-2017
Algorithme - Suppression dans une liste triée
supprime un caractère c dans une liste triée. Retourne la valeur de la nouvelle tête de liste
Algo récursif. Si la liste est vide ou si l’élément à supprimer est inférieur à l’élément en tête de
liste, on ne fait rien, sinon si l’élément à supprimer est égalà la tete de liste, on supprime en
tête, sinon on appelle récursivement la suppression sur le suivant de la tête de liste.
FONCTION supprimeTrie
DONNÉES
: tete ∈ ENT , c ∈ CAR
DONNÉES
: contenu ∈ TAB de CAR
DONN. MOD. : suivant ∈ TAB de ENT
DONN. MOD. : libre ∈ ENT
RÉSULTAT
: ENT
SI tete = -1 or c < contenu[tete] ALORS
RETOUR
tete
SINON
SI c = contenu[tete] ALORS
RETOUR
supprimeTete(tete, suivant, libre)
SINON
suivant[tete]
supprimeTrie(suivant[tete], c, contenu, suivant, libre)
RETOUR
tete
FIN SI
FIN SI
FIN PROCÉDURE
***************************************************************************
–15/15–
Schéma de la liste chaînée
Mémoire de gestion de liste
libre
contenu
lst
suivant
0
1
2
3
4
5
6
Schéma de la liste chaînée
Mémoire de gestion de liste
libre
contenu
lst
suivant
0
1
2
3
4
5
6
Schéma de la liste chaînée
Mémoire de gestion de liste
libre
contenu
lst
0
1
2
3
4
5
6
suivant
Schéma de la liste chaînée
Mémoire de gestion de liste
libre
contenu
lst
suivant
0
1
2
3
4
5
6
Schéma de la liste chaînée
Mémoire de gestion de liste
libre
contenu
lst
suivant
0
1
2
3
4
5
6
Schéma de la liste chaînée
Mémoire de gestion de liste
libre
contenu
lst
0
1
2
3
4
5
6
suivant
Schéma de la liste chaînée
Mémoire de gestion de liste
libre
contenu
lst
suivant
0
1
2
3
4
5
6
Schéma de la liste chaînée
Mémoire de gestion de liste
libre
contenu
lst
suivant
0
1
2
3
4
5
6
Schéma de la liste chaînée
Mémoire de gestion de liste
libre
contenu
lst
0
1
2
3
4
5
6
suivant
Schéma de la liste chaînée
Mémoire de gestion de liste
libre
contenu
lst
suivant
0
1
2
3
4
5
6
Schéma de la liste chaînée
Mémoire de gestion de liste
libre
contenu
lst
suivant
0
1
2
3
4
5
6
Schéma de la liste chaînée
Mémoire de gestion de liste
libre
contenu
lst
0
1
2
3
4
5
6
suivant
Téléchargement