Vous êtes sur la page 1sur 5

École supérieure des sciences et de la

technologie de Hammam Sousse


Année universitaire 2019/2020

Matière : Atelier de Enseignant (e) : Samia Ben


Filière :LI 1
programmation 2 Ismail
TD 1
Objectif : Listes simplement chainées

Exercice 1 :
On donne la structure livre définie de la façon suivante :
Struct livre
{
int code ;
char titre [31] ;
float prix ;
};
Le programme suivant permet de créer une liste simplement chainée de livre :
1- Définir un type liste
2- Remplir une liste de livre de façon interactive (O/N)
3- Insérer un livre après ou avant une position dans la liste
4- Afficher la liste après chaque changement.

//Définition de la structure livre


struct livre
{int code;
char titre[31];
float prix;
};
typedef struct livre livre;
//Définition de la structure cellule
struct cellule
{livre element;
cellule *suivant;
};
typedef struct cellule cellule;
//Définition d'un type liste et d'un type position
typedef cellule *liste;
typedef cellule *position;
//Insertion d'un élément en queue de la liste
void inserer_queue (liste *L,livre x)
{position p,Q;
p=(cellule*)malloc(sizeof(cellule));
p->element=x;
p->suivant=NULL;
if(!*L) *L=p;
else
{ Q=*L;
while(Q->suivant) Q=Q->suivant;
Q->suivant=p;
}}
//Insertion d'un élément en tete de la liste
void inserer_tete(liste*L,livre x)
{position p;
p=(cellule*)malloc(sizeof(cellule));
p->element=x;
p->suivant=*L;
*L=p;
}
//Insertion d'un élément après une position dans la liste
void inserer_apres(position p,livre x)
{position Q;
Q=(cellule*)malloc(sizeof(cellule));
Q->element=x;
Q->suivant=p->suivant;
p->suivant=Q;}
//Insertion d'un élément avant une position dans la liste
void inserer_avant(liste *L,position p,livre x)
{
position Q,t;
Q=(cellule*)malloc(sizeof(cellule));
Q->element=x;
Q->suivant=p;
if(*L==p) *L=Q;
else
{t=*L;
while(t->suivant!=p) t=t->suivant;
t->suivant=Q;
}
}
//Affichage de la liste
void afficher_liste(liste L)
{int i=1;
while(L)
{printf("Livre Numero %d\n",i++);
printf("\t Code:%d\n",L->element.code);
printf("\t Titre:");puts(L->element.titre);
printf("\t Prix:%.3f\n\n",L->element.prix);
L=L->suivant;
}}
//chercher une position dans une liste
position recherche(liste L,int y)
{
while(L)
if(L->element.code==y) break;
else L=L->suivant;
return L;
}
//Suppression d'un élément de la liste
void supprimer_element(liste *L, position p)
{ position Q;
if(p==*L) // L'élément à supprimer se trouve en tête de la liste
*L=p->suivant;
else //L'élément à supprimer se trouve à l'intérieur de la liste
{
Q=*L;
while(Q->suivant!=p) Q=Q->suivant;
Q->suivant=p->suivant;
}
free(p);//Libérer la zone mémoire pointée par p
}

Le programme principal correspondant comme suit :

void main()
{
livre x;
liste l=NULL; position p;
int i=1,c; char rep;
//saisie interactive des livres
do
{
printf("\nsaisie des informations du livre %d :\n",i++);
do{
printf("\t donner le code :");
scanf("%d",&x.code);
}while(recherche(l,x.code) );
printf("\t donner le titre: ");
fflush(stdin);
gets(x.titre);
do{
printf("\t donner le prix : ");
scanf("%f",&x.prix);
}while(x.prix<=0);
inserer_queue(&l,x); // ou inserer_tete (&l,x);
printf("autre livre a inserer o/n ?");
fflush(stdin);
scanf("%c",&rep);
}
while (tolower(rep)=='o');//ou toupper(rep)=='O'
afficher_liste(l);
//ajouter d’un livre apres l’auttre
printf("autre livre a ajouter o/n ?");
fflush(stdin);
scanf("c",&rep);
if(tolower(rep)=='o')
{
printf ("donner le code du livre ");
scanf("%d",&c);
p=recherche(l,c);
if(p!=NULL)
{
do {
printf("donner le code:");
scanf("%d",&x.code);
}while(recherche(l,x.code) );
printf("\t donnez le titre ;");
fflush(stdin);
gets(x.titre);
do {
printf ("\t donner le prix");
scanf ("%f",&x.prix);
} while (x.prix<=0);
inserer_apres (p,x);
afficher_liste(l);
}
else printf ("le code n exite pas\n");}
//suppressin d’un element
printf ("voulez vous suprimer un livre o/n? ");
fflush(stdin);
scanf("c",&rep);
if(tolower(rep)=='o')
{
printf ("donner le code du livre a suprimez");
scanf("%d",&c);
p=recherche(l,c);
if (p)
{
supprimer_element(&l,p);
afficher_liste(l);}
else
printf ("le code n exite pas\n");}
}
Travail demandé : Améliorer le programme principal main () en réalisant une fonction de
saisie des informations des livres (Saisir) et une fonction qui affiche le menu des choix
possibles (Menu).
Exercice 2

1.Ecrire une fonction Saisir permettant de remplir un tableau T avec N entiers.


2.Ecrire une fonction Copier qui permet de copier un tableau de N entiers dans une liste chaînée.
3.Ecrire une fonction AfficherPaire permettant d’afficher les nombres pairs d’une liste
chainée d’entiers.
4.Ecrire un programme principal permettant de tester ces fonctions.
Exercice 3

Notre but et de trier une liste simplement chainée d’entiers. Pour cela on vous demande de :
1- Définir les structures et les types de données nécessaires.
2- Ecrire une fonction Inserer_queue qui permet d’insérer un élément en queue de la liste
3- Ecrire une fonction Remplir qui permet de créer une liste. La saisie doit se faire d’une
manière interactive (cette fonction invoque la fonction Inserer_queue).
4- Ecrire une fonction Afficher qui permet d’afficher le contenu de la liste.
5- Ecrire une fonction Tri qui permet de trier les éléments de la liste selon l’ordre
croissant. (Il faut s’inspirer des algorithmes de tri des vecteurs)
6- Ecrire le programme principal.