Tableaux remplis partiellement



I - Représentation

Nous avons vu qu'un tableau est un objet statique, c'est à dire que sa dimension ne peut pas être modifiée pendant l'exécution d'un programme.

Dans certains cas, on ne peut pas connaitre à l'avance le taille nécessaire pour stocker les données dans un tableau. Il faudra alors prévoir large, c'est à dire déclarer un tableau de taille suffisante pour tous les cas de figure. Cela signifie que l'on va remplir le tableau partiellement jusqu'à un certain indice définissant la fin des données.

Pour représenter un tableau rempli partiellement, on peut utiliser une variable entière qui contiendra à tout moment l'indice de fin des données.

Pour fixer les idées, prenons une variable T pour le tableau et une variable N pour l'indice de fin. On aura donc les déclarations suivantes:

const int M = Nombre maximum d'éléments;
int N;
int T[M];

Les données utiles sont sockées dans les éléments d'indice 0 à N (schéma).

Le tableau est plein lorsque N est égal à M-1 (schéma)

Par convention, le tableau sera considéré comme vide sera lorsque N=-1 et non pas 0. Pourquoi pas zéro ? Parce que cela signifierait que T[0] est le dernier élément. Le tableau ne serait donc pas vide ! Mais pourquoi la valeur -1 ? Vous trouverez la réponse à cette question dans le paragraphe suivant.


II - Adjonction d'une valeur

II- 1 Adjonction à la fin

Pour ajouter une valeur V dans un tableau rempli partiellement, le plus simple est de l'ajouter à la fin. On appelle cette opération empiler. L'élément qui suit le dernier prend la valeur V et l'indice de fin est incrémenté (schéma):

 T [N+1] = V;
 N++;

Nous pouvons à présent voir l'intérêt de la convention N=-1 pour représenter un tableau vide, car avec cette convention les instructions précédentes permettent également d'empiler une valeur dans un tableau vide.

II- 2 Insertion

Insérer une valeur dans un tableau est une opération plus complexe. Supposons que l'on souhaite insérer une valeur V à l'indice P (P ≤ N) du tableau. Il faut d'abord "faire de la place" pour cette nouvelle valeur, c'est à dire décaler toutes les valeurs entre les indices P et N, d'un cran vers la droite. La valeur V peut ensuite être affectée à l'élément d'indice P. Puis, comme on a ajouté une valeur, l'indice de fin augmente de 1 (schéma):

for (i = N; i >= P; i--) T[i+1] = T[i];
T[P] = V;
N++;

Le décalage d'une valeur d'un cran vers la droite se fait par l'affectation T[i+1] = T[i] répétée dans la boucle for. Notez que l'on est obligé de partir de la fin et de décrémenter le compteur. En procédant dans le sens inverse, on aurait recopié la valeur V vers la droite dans tous les éléments d'indice P à N+1 !


III - Suppression d'un élément

III- 1 Suppression du dernier élément

Le dernier élément d'un tableau est le plus simple à supprimer, pour cela il suffit de dépiler, c'est à dire de décrémenter l'indice de fin (schéma):

 N--;
III- 2 Suppression d'un élément quelconque (différent du dernier)

Supprimer l'élément d'indice P (P < N ) signifie décaler toutes les valeurs qui suivent P d'un cran vers la gauche, puis décrémenter l'indice de fin (schéma):

for (i=P; i <= N; i++) T[i] = T[i+1];
N--;

IV - Notion de pile

Un tableau rempli partiellement sur lequel on ne fait que des opérations empiler et dépiler est une structure de données fondamentale de l'informatique que l'on appelle une pile (stack en anglais).

En particulier, la gestion mémoire des variables locales et des paramètres de sous-programmes utilise une pile: les valeurs des variables sont empilées lorsque l'on rentre dans le sous-programme et dépilées à la sortie.