Vous êtes sur la page 1sur 2

Université d’Aix-Marseille 2012/2013

Projet algorithmique - ENSIN4U1 L2 Informatique - mathématiques

TP6 : les listes chaı̂nées.

Exercice 1 Une liste chaı̂née peut être implémentée en C de la manière suivante.

typedef int ELEMENT; /* pour une liste d’entiers */

typedef struct maillon *LISTE;

typedef struct maillon{


ELEMENT val;
LISTE suiv;
} MAILLON;

Vous écrirez ces définitions de structures dans un fichier structures liste.h.


Les fonctions de traitement des listes seront écrites dans un fichier nommé listes.c.
Elles seront testées dans un fichier main.c. Vous écrirez un fichier makefile pour compiler
ces fichiers.
Les listes chaı̂nées sont des structures dynamiques : les maillons sont créés et détruits au
fur et à mesure des besoins. La fonction permettant de créer un maiull peut être implémentée
par

LISTE cree_maillon(ELEMENT e){


LISTE l;
l=malloc(sizeof(MAILLON));
l->val=e;
l->suiv=NULL;
return l;
}

Écrivez les fonctions suivantes (elles ont souvent une version récursive simple)
– LISTE insererTete(ELEMENT e, LISTE l); qui insére un nouveau maillon d’élément
e en tête de la liste l.
– void afficher(LISTE l); qui affiche les éléments de l.
– LISTE insererQueue(ELEMENT e, LISTE l); qui insére un nouveau maillon d’élément
e en queue de la liste l.
– int appartient(ELEMENT e, LISTE l); retourne 1 si e est présent dans la liste l et
0 sinon ;
– LISTE supprimer(ELEMENT e, LISTE l); supprime toutes les occurrences de e dans
la liste l ;
– void vider(LISTE l); libère l’espace mémoire occupé par la liste l ;

1
– LISTE triInsertion(LISTE l);. Vous pourrez d’abord écrire une fonction LISTE
insererTriee(ELEMENT e, LISTE l) qui insère un élément dans une liste triée l en
conservant l’ordre.
Vous pourrez tester vos fonctions avec le programme principal suivant :

int main(){
LISTE l=NULL;
int i;
for (i=0;i<11;i++){
l=insererTete(i,l);
}
afficher(l);
for (i=0;i<11;i++){
l=insererQueue(i,l);
}
afficher(l);
printf("%d\n",rechercher(1,l));
printf("%d\n",rechercher(11,l));
l=supprimer(1,l);
afficher(l);
vider(l);
return 0;
}

Exercice 2
Une liste doublement chaı̂née permet d’accéder directement au maillon précédent du
maillon courant d’une liste via un champ prec. Le champ suiv du dernier maillon pointe
circulairement sur le premier maillon et le champ prec du premier maillon vide pointe vers le
dernier maillon. Pour éviter le cas particulier des listes vides, on supposera en plus que toute
liste contient un premier maillon fictif dont la valeur ne sera jamais lue.
– À partir de la structure des listes chaı̂nées simple, définissez la structure des listes
doublement chaı̂nées avec maillon fictif.
– Écrivez une fonction textttvoid initListe(LISTE l) qui crée une liste ne comprenant que
le premier maillon fictif.
– Reprenez les fonctions précédentes et adaptez-les aux listes doublement chaı̂née.

Vous aimerez peut-être aussi