TD N°2 – Listes chaînées
Exercice 0 *
On souhaite écrire deux fonctions simples permettant d’ajouter des éléments dans une liste chainée d’entiers.
1. Quelle est la structure de donnée permettant de définir une telle liste ?
2. Ecrire la fonction afficheListe qui affiche tous les éléments d’une liste existante.
3. Ecrire la fonction ajoutDébut qui ajoute une cellule en tête de la liste chaînée.
4. Ecrire la fonction ajoutFin qui ajoute une cellule en fin de liste chaînée.
5. Ecrire la fonction existe qui indique si une valeur donnée se trouve dans la liste ou pas (retourne un entier :
en C, 0 signifie FAUX et n’importe quel autre entier signifie VRAI).
Exercice 1 **
Même exercice, mais on manipule cette fois une liste chaînée d’entiers triée croissante. La structure de donnée est
la même, mais il faut désormais faire une recherche avant d’ajouter une cellule à la position appropriée.
1. Ecrire la fonction recherchePos qui renvoie un pointeur sur la cellule précédant la position d’insertion, ou
NULL si on doit réaliser cette insertion en tête de liste.
2. Ecrire la fonction insère qui, en utilisant la fonction précédente, réalise l’insertion au bon endroit.
Exercice 2 ****
Soient liste1 et liste2 deux listes doublement chainées de réels triés par ordre croissant.
1. Indiquer la structure de données adéquate.
2. Ecrire la fonction insèrePos (recherchePos ne change pas par rapport à l’exo 1).
3. Proposer l'algorithme de la fonction concatène_liste(a, b) qui met la liste a au bout de la liste b.
4. Proposer l'algorithme de la fonction inverse_liste() permettant d'inverser une liste, de telle façon que
l'ordre du tri soit inversé, sans créer de nouvelle cellule (donc en reconfigurant le chaînage de la liste existante).
5. Proposer l'algorithme de la fonction fusionne_liste(a, b) qui fusionne la liste a et la liste b triées de
telle sorte que la liste résultante soit une liste doublement chainée triée par ordre croissant et composée de la
fusion de tous les éléments des deux listes a et b.
Exercice 3 ****
Les matrices creuses sont des matrices contenant essentiellement des zéros.
Par souci d’économie d’espace, on peut représenter une matrice creuse par une liste
chaînée contenant uniquement les éléments non nuls avec leur position.
Dans l’exemple donné ici, on aurait : (1, [1,5]) → (6, [2,4]) → (2, [4,2]) → NULL
1. Proposez une structure de données permettant de représenter une matrice creuse. Attention, il faut aussi
stocker dans la structure la taille de la matrice.
2. Proposer un algorithme id qui indique si deux matrices creuses de même taille sont identiques ou non.
3. Proposer un algorithme super qui indique si deux matrices creuses de même taille sont superposables, c’est-à-
dire que leurs valeurs non nulles se trouvent aux mêmes positions.