Les listes chaînées 1 Implémentation de liste chaînée en tableau

publicité
TD no 1
ESIEE IGI-3005
2016-2017
Les listes chaînées
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/8–
TD no 1
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
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.
Exercice 2. Faire un schéma de la configuration après insertion de 'a' en tête de liste
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
–2/8–
ESIEE IGI-3005
TD no 1
2016-2017
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
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
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.
–3/8–
TD no 1
ESIEE IGI-3005
2.1
2016-2017
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
0
1
2
3
4
5
-1
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.
–
–
–
–
–
–
2.2
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'.
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 :
Mémoire de gestion de liste
libre 0
0
1
2
3
4
5
contenu
?
?
?
?
?
?
suivant
1
2
3
4
5
-1
–4/8–
ESIEE IGI-3005
TD no 1
2016-2017
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
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.
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
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
–5/8–
ESIEE IGI-3005
2.5
TD no 1
2016-2017
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
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
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)
–6/8–
ESIEE IGI-3005
TD no 1
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
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
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
–7/8–
ESIEE IGI-3005
TD no 1
2016-2017
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
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
–8/8–
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