Université des Sciences et Technologies de Lille
Licence Miage - Programmation 1 - TD



Les listes chaînées


Dans tous les exercices, on dispose d'un type Liste défini par

   type Cellule;
   type Liste is access Cellule;
   type Cellule is record
      Valeur:Element;
      Suivant:Liste;
   end record;
Element est un type quelconque.



Exercice 1   Écrire une procédure Inverser qui inverse une liste : les éléments de tête deviennent les éléments de queue.


Exercice 2   Soit R, un prédicat unaire sur le type Element: R est une fonction qui prend en argument un Element et retourne un booléen.

· Écrire une fonction Selection acceptant comme paramètre générique R: Selection prend en argument une liste et construit une nouvelle liste ne contenant que les éléments satisfaisant R.

·Écrire une procédure Selectionner, qui élimine d'une liste tous les éléments qui ne satisfont par R. Bien sûr, cette procédure doit s'exécuter avec un espace mémoire constant.


Exercice 3   On suppose que le type Element est muni d'une relation d'ordre < . Programmer le tri par insertion avec recherche séquentielle sur la structure de liste chaînée.


Exercice 4   Les matrices creuses sont des matrices d'entiers comprenant une majorité de 0 .
æ
ç
ç
ç
è
0 2 0 0 0
1 0 3 0 0
0 0 0 0 0
0 0 0 6 0
ö
÷
÷
÷
ø
Par souci d'économie, on peut représenter une matrice creuse par une liste chaînée, contenant uniquement les éléments non nuls, avec leurs indices.
[ (2,(1,2)); (1,(2,1)); (3,(2,3)); (6,(4,4)); (0, (4,5))]
Les éléments sont rangés par indice croissant (ligne, puis colonne). Pour connaitre la dimension de la matrice, l'élément d'indice maximal est précisé dans la liste chainée, meme si celui-ci est nul.

· On définit un type composé Indice , avec deux champs: ligne, colonne:Positive . Écrire une fonction < qui compare deux indices.

· Écrire un type matrice_creuse .

· Écrire une fonction qui fait la somme de deux matrices creuses.


Exercice 5   Lors du TP La laverie automatique, vous avez conçu un paquetage paq_file, avec les primitives Enfiler et Defiler. La procédure Defiler s'exécute en temps constant, mais la procédure Enfiler est en temps linéaire: il faut parcourir la liste pour atteindre le dernier élément. Comment pourrait-on améliorer la structure de données pour obtenir une opération d'enfilage en temps constant ? Réécrivez la procédure Enfiler.