Gestion de l'espace de stockage
Pour ajouter un élément, il faut pouvoir trouver un élément "libre" dans le tableau.
Une première solution consiste à marquer les éléments libres du tableau (par exemple champs suivant de l'élément a pour valeur -1). Dans ce cas, il faudra parcourir le tableau (complexité O(n/2) en moyenne). Par suite, la primitive insérerAprès ne sera plus en complexité O(1) puisqu'il faudra d'abord trouver un élément libre.
Une solution compatible avec la complexité des primitives consiste à gérer cet espace de stockage en constituant la liste des cellules libres.
On modifie donc en conséquence la description de listeSC_Car :
listeSC_Car=structure
tailleStock:entier;
premier:entier;
premierLibre:entier;
vListe:stockListe;
finstructure;
Par convention, l'espace de stockage sera saturé lorsque l'index premierLibre vaut 0 (la liste des cellules libres est vide). On définit donc la fonction de test :
fonction listeLibreVide(val L:listeSC_Car):booléen;
début
retourner L.premierLibre==0;
fin
finfonction
On définit deux primitives liées à la gestion du stockage :
- mettreCellule : met une cellule en tete d'une liste,
- prendreCellule : supprime la cellule de tete d'une liste.
Les opérations sont respectivement de type insererEnTete et supprimerEnTete. Préciser la liste sur laquelle s'effectue l'opération revient à préciser le pointeur de tête surlequel on travaille.
fonction prendreCellule(ref L:listeSC_Car,ref tete:entier):entier;
var nouv:entier;
début
nouv=tete;
tete=suivant(L,nouv);
retourner nouv;
fin
finfonction
fonction mettreCellule(ref L:listeSC_Car,val P:entier,ref tete:entier):vide;
début
L.vListe[P].suivant=tete;
tete=P;
fin
finfonction
Primitives de modifications
fonction créer_liste(ref L:listeSC_Car;val tailleMax:entier):vide;
var i:entier;
début
L.tailleStock=tailleMax;
L.premier=0;
L.premierLibre=1;
pour i allant de 1 à L.tailleStock-1 faire
L.vListe[i].suivant=i+1;
finpour
L.vListe[tailleStock].suivant=0;
fin
finfonction
fonction insérerAprès(val x:car; ref L:listeSC_Car; val P:entier):bool;
var nouv:entier;
début
si listeLibreVide(L) ou P==0 alors
retourner faux;
sinon
nouv=prendreCellule(L,L.premierLibre);
L.vListe[nouv].valeur=x;
L.vListe[nouv].suivant=suivant(L,P);
L.vListe[P].suivant=nouv;
retourner vrai;
finsi
fin
finfonction
fonction insérerEnTete(val x:car;ref L:listeSC_Car):bool;
var nouv:entier;
début
si listeLibreVide(L) alors
retourner faux;
sinon
nouv=prendreCellule(L,L.premierLibre);
L.vListe[nouv].valeur=x;
mettreCellule(L,nouv,L.premier);
retourner vrai;
finsi
fin
finfonction
fonction supprimerAprès(ref L:listeSC_Car;val P:entier):bool;
var suivP:entier;
début
suivP=suivant(L,P);
si P==0 ou suivP==0 alors
retourner faux;
sinon
L.vListe[P].suivant=suivant(L,suivP);
mettreCellule(L,suivP,L.premierLibre);
retourner vrai;
findi
fin
finfonction
fonction supprimerEnTete(ref L:listeSC_Car):bool;
var tete:entier;
début
si listeVide(L) alors
retourner faux;
sinon
tete=L.premier;
L.premier=suivant(L,tete);
mettreCellule(L,tete,L.premierLibre);
retourner vrai;
findi
fin
finfonction