Vous êtes sur la page 1sur 8

Algorithmique & Structures de données II

LES POINTEURS – CONCEPTS THEORIQUES -

PROBLEMATIQUE
Activité 1 :
On considère un tableau d’entiers T de n éléments. On veut écrire un algorithme qui
permet d’insérer un élément x saisie à partir du clavier, juste après le premier
élément positif de T.

Commentaires
(i) Dans le cas où le premier élément positif est rencontré, le décalage du reste des
éléments de T d’une case à droite est coûteux en terme de temps d’exécution.
(ii) Si le dernier élément de T s’avère le premier élément positif, il y a risque de
débordement puisque l’insertion de x se fera hors tableau ?!
(iii) On peut alors conclure que la structure de données utilisée n’est appropriée.

Activité 2 :
On dispose d’un fichier Etudiant comportant entres autres la rubrique Moyenne. On
désire réaliser un traitement qui consiste à lire à partir de ce fichier toutes les
moyennes supérieures à 10 et de les mémoriser dans un tableau en vue de réaliser
certaines statistiques.

Solution : Utiliser un tableau T de réels comme structure de données.

Commentaires
(i) Comme le nombre d’éléments du tableau T est connu à l’avance, cela risque de
poser un problème : dans le cas où le nombre de moyennes lues à partir du fichier
s’avère supérieur à la taille de T, il sera alors impossible de réaliser le traitement.
Dans ce cas, on va se dire que partant du Fichier Etudiant, on commence par trouver
le nombre d’enregistrements et on déclarera alors un tableau dont la taille serait la
valeur du nombre d’enregistrements. Il y aura alors un surdimensionnement du
tableau T étant donné que les moyennes des différents enregistrements ne sont pas
toutes supérieures à 10. D’où gaspillage de l’espace mémoire qui un espace coûteux.
(ii) On peut alors conclure que la structure de données tableau n’est pas la plus
appropriée pour cet exemple.

Quelle structure de données doit-on utiliser ?


Dans les deux activités proposées, la structure Tableau ne résout que partiellement le
problème avec en prime une exécution couteuse.
En fait, on doit penser à une structure de données capable de mémoriser au fur et à
mesure que l’exécution avance les différentes valeurs produit par le programme sans
avoir de soucis en matière de taille ou d’espace.
Une telle structure qui varie donc au cours de l’exécution d’un programme est
appelée structure dynamique.

Question : Comment représenter algorithmiquement cette structure ?

2018-2019 Page : 1 ISET de Radès


Algorithmique & Structures de données II

Pour répondre à cette question, on va revenir en arrière pour rappeler la définition et


les caractéristiques d’une variable. On a défini une variable comme étant un
emplacement mémoire capable de prendre plusieurs valeurs au cours de l’exécution
d’un programme mais à un instant donné, elle ne peut contenir qu’une et une seule
valeur. Cet emplacement est réservé avant même l’exécution (au moment de la
compilation) et restera disponible tant que le programme s’exécute. D’où l’aspect
statique attribué aux variables.
On sait également, qu’une variable est caractérisée par son nom, son type et son
contenu. Ce dernier peut alors être numérique (entier, réel, etc.), alphanumérique
(caractère ou chaine), logique (0 ou 1).
En outre, le contenu peut être une adresse (nouveauté par rapport aux types de base)
et dans ce cas la valeur est dite de type pointeur. On dira alors qu’il s’agit d’une
variable de type pointeur ou simplement un pointeur.

Définition
Un pointeur est une variable spéciale pouvant contenir l’adresse d’une autre
variable.

Remarque :
(i) Le rôle d'un pointeur est de permettre l'accès à une structure qui serait créée avant
ou lors de l'exécution.
(ii) La déclaration doit spécifier le type de base de l'objet qui pourra être accessible à
l'aide du pointeur.
(iii) Un pointeur est toujours une valeur absolue.
(iv) Les adresses admissibles pouvant être prises par un pointeur : ce sont les entiers
de longueur fixe (uniformité => référence uniforme et homogène).
(vi) Le type pointeur est considéré comme étant un type de base.

Représentation Algorithmique d’un Pointeur


Il ne s’agit pas de représenter seulement P en tant que variable mais également le lien
existant entre P et l’autre variable.
Si P est un pointeur qui contient l’adresse d’une variable dont le contenu est
l’information a, on peut alors représenter ce fait par le schéma suivant :

L’adresse de la variable contenant l’information a est notée


algorithmiquement par P@. On représentera alors
algorithmiquement de la façon suivante :
2018-2019 Page : 2 ISET de Radès
Algorithmique & Structures de données II

Type Pointeur = @ Objet


Variable P : Pointeur
Où Objet est de type simple ou structuré. Cette déclaration peut être également
représentée par :
Variable P : @ Objet.
Par exemple, Si P est un pointeur d’entier, on le représenté alors de la façon
suivante :
Variable P : @ Entier.

Convention :
(i) P désigne la variable qui contient l’adresse.
(ii) P@ désigne l’objet dont l’adresse est rangée dans P.

Applications
Application 1 :
On considère deux variables P1 et P2 de type pointeur permettant d’accéder
respectivement aux informations a et b. Que donnera l’exécution de l’action P1P2 ?
Situation initiale :
P1 P2

P1@ P2@
aa b

L’exécution de l’action P1P2 donnera le schéma suivant :


P1P2 implique que dans P1 on va placer l’adresse de P2, cela veut dire que P1 va
pointer sur l’adresse contenant l’information b, on aura alors :
P1 P2

P1@, P2@
a
b
Constat : l’information a n’est plus accessible car on a perdu son adresse qui se
trouvait dans P1 avant l’affectation. Autre chose, l’information b peut être atteinte
soit par P1 soit par P2.

Application 2 :
On considère deux variables P1 et P2 de type pointeur permettant d’accéder
respectivement aux informations a et b. Que donnera l’exécution de l’action
P1@P2@ ?
Situation initiale :

P1 P2

P1@ P2@
aa b
2018-2019 Page : 3 ISET de Radès
Algorithmique & Structures de données II

L’exécution de l’action P1@P2@ donnera le schéma suivant :


P1 P2

P1@ P2@
ba b

Constat : a n’existe plus et b existe en deux exemplaires.

Remarque :
Si un pointeur P ne correspond à aucune adresse d’objet, on notera cette situation
comme suit :
PNIL ou PNULL ou bien schématiquement : ou -1

Primitives sur les Pointeurs


On rappelle que pour une variable statique la réservation de la zone mémoire se fait
au moment de la compilation et restera disponible tout au long de l’exécution du
programme.

Pour les variables de type pointeur, qui ont l’aspect d’être dynamique, la réservation
de l’espace mémoire se fait au cours de l’exécution du programme à l’aide de la
primitive Allouer. Au cours de cette même exécution, si on juge ne plus avoir besoin
de cette variable, on peut s’en passer (la libérer), on utilise alors la primitive Libérer.
Schématiquement, et si P est un pointeur, Allouer (P) signifie qu’on va trouver un
emplacement mémoire libre suffisant pour contenir un objet pointé par P.

P@
Objet

Libérer(P) consiste à supprimer l’objet pointé par P (P@) : cela veut dire que l’objet
n’est plus accessible et l’espace libéré sera rajouté à la mémoire.

Application : On considère l’action P1P2; cela donnera le schéma suivant :

P1 P2

P1@, P2@
a b

2018-2019 Page : 4 ISET de Radès


Algorithmique & Structures de données II

On désire que P1 ne pointe vers plus rien, cela veut dire que P1 serait égale à NIL. Si
on se permettra d’effectuer la primitive Libérer(P1), l’objet b disparaîtra. Donc, pour
garder b on doit avoir la figure suivante :
P1 P2

P2@
b

Pointeurs d’Enregistrement

Problématique : On veut représenter un tableau T de N entiers.


Solution : Trouver une structure de données permettant de représenter non
seulement chaque élément de T mais également le lien existant avec les autres
éléments ; il s’agit alors de représenter un pointeur d’enregistrement dont la
déclaration est la suivante :

Type
Pointeur_Elem = @Elem_Tab
Elem_Tab = Enregistrement
Info : entier
Suiv : Pointeur_Elem
Fin
Variable
Q,P : Pointeur_Elem

Algorithme d’implémentation d’un tableau de N entiers :


On dispose d’un tableau T de n entiers.
Début
QNIL
Pour IN à 1 Faire (* Ordre décroissant pour obtenir des éléments non inversés *)
Allouer(P)
P@.Info  T(I)
P@.SuivQ
QP
Fin Pour
Fin

Exécution de l’algorithme à la main :

Traces de l’algorithme pour N=3.

2018-2019 Page : 5 ISET de Radès


Algorithmique & Structures de données II

Soit T un tableau comportant les 3 3 6 -4 éléments :

Initialement
Q
QNIL : NIL

I=3
P, Q
1 er élément de T : -4 NIL

I=2
2 ème élément de T : 6 @ -4 NIL

I=1

3 ème élément de T : 3 @ 6 @ --4 NIL

Conclusion
On a pu implémenter un tableau de N entiers en utilisant un pointeur
d’enregistrement. Cette application n’est pas générale car dans certains problèmes,
on peut ne pas connaître à l’avance le nombre d’éléments à créer et ce n’est qu’au
cours de l’exécution que l’on va découvrir.
Si on revient à l’énoncé de l’activité 2 présentée dans la problématique (paragraphe
1), on a dit : qu’on dispose d’un fichier Etudiant comportant entres autres la rubrique
Moyenne et on désire réaliser un traitement qui consiste à lire à partir de ce fichier
toutes les moyennes supérieures à 10 et de les mémoriser dans un tableau en vue de
réaliser certaines statistiques.
On voit clairement, que le nombre d’étudiant ayant la moyenne ne peut pas être
connu à l’avance. Bien sûr l’utilisation d’un tableau puis l’implémentation de ce
tableau avec un pointeur d’enregistrement restera possible mais n’est plus
recommandée.
On doit utiliser alors une structure dynamique capable de représenter des éléments
au cours de l’exécution d’un programme tout en assurant les liens entre eux ; une
telle structure existe : il s’agit de la structure de données LISTE. C’est l’objet du
chapitre suivant.

2018-2019 Page : 6 ISET de Radès


Algorithmique & Structures de données II

LES POINTEURS – EXERCICES PROPOSES -

Exercice 1
On considère l’algorithme suivant :
Algorithme Exec_Ptr
Type Pointeur = @Réel
Variable P : Pointeur
A : Réel
Début
Allouer(P)
A5
P@  A
P@  P@ + 1
A  P@
Fin

Faites la table d’exécution de cet algorithme et donnez les valeurs finales de A et P@.

Exercice 2
On considère l’algorithme suivant :
Algorithme Exec_Ptr
Type Pointeur = @Entier
Variable P : Pointeur
A, B : Entier
Début
A10
B50
PA
BP@
P@  20
Fin
2.1. Corrigez cet algorithme si vous jugez que c’est nécessaire ?
2.2. Faites la table d’exécution de cet algorithme et donnez les valeurs finales de A, de
B, de P et de P@.

Exercice 3
On considère l’algorithme suivant :
Algorithme Exec_Ptr
Type Pointeur = @Entier
Variable P, Q : Pointeur
Début
Allouer(P)
QNIL
P@  10
QP
Q@  Q@ + 2

2018-2019 Page : 7 ISET de Radès


Algorithmique & Structures de données II

Libérer(P)
Fin

Faites la table d’exécution de cet algorithme et donnez les valeurs finales de P, de Q,


de P@ et de Q@.

Exercice 4
On considère l’algorithme suivant :
Algorithme Exec_Ptr
Type Pointeur = @Entier
Variable P1, P2 : Pointeur
A, B, C : Entier
Début
A1
B2
C3
P1A
P2C
P2@  B
P1@  (P2@ + 1)
P1P2
P2B
P2@  P2@ + 1
(P@)@  P2@
A ((P2@)@ * P1@) + 1
P1A
Fin

Faites la table d’exécution de cet algorithme.

Exercice 5
En utilisant les pointeurs, écrivez un algorithme permettant de calculer à l’aide d’un
pointeur la longueur d’une chaine de caractère saisie à partir du clavier.

Exercice 6
Ecrivez un algorithme qui range les éléments d’un tableau A d’entiers dans l’ordre
inverse. On utilisera deux pointeurs P1 et P2 et variable numérique pour réaliser la
permutation des éléments.

Exercice 7
En utilisant les pointeurs, écrivez un algorithme qui permet de supprimer toutes les
voyelles d’une chaine de caractères donnée.

2018-2019 Page : 8 ISET de Radès

Vous aimerez peut-être aussi