#include <stdio.
h>
#include <stdlib.h>
/*****Liste unidirectionnelle*/
struct cellule
{
int info ;
struct cellule *suivant ;
};
struct liste
{
struct cellule * premier ;
struct cellule * dernier ;
};
const unsigned N = 10;
struct liste TabListe[10];
/******Fonction creer_liste*******/
void creer_liste(struct liste *L)
{
L->premier=NULL ;
L->dernier=NULL ;
}
/******Fonction liste_vide*******/
int liste_vide(struct liste L)
{
return L.premier==NULL;
}
/******Fonction inserer_avant_premier******/
void inserer_avant_premier(struct liste * L , int x)
{
struct cellule * p;
p = (struct cellule*)malloc(sizeof(struct cellule));
p->info = x;
p->suivant = L->premier ;
if(L->premier==NULL)
L->dernier=p;
L->premier = p;
}
/**Fonction Remplir 1 en utilisant inserer_avant_premier**/
void remplir1(struct liste * L,int n )
{
int x,i;
for(i=1 ; i<=n ; i++)
{
printf("Donner un entier : ");
scanf("%d",&x);
inserer_avant_premier(L , x);
}
}
/******Fonction inserer_apres_dernier******/
void inserer_apres_dernier(struct liste * L , int x)
{
struct cellule *p;
p = (struct cellule*)malloc(sizeof(struct cellule));
p->info = x;
p->suivant = NULL ;
if(L->dernier==NULL)
L->premier=p;
else
(L->dernier)->suivant=p;
L->dernier = p;
}
/**Fonction Remplir 1 en utilisant inserer_aprés_dernier**/
void remplir2(struct liste *L,int n)
{
int x,i;
for(i=1 ; i<=n ; i++)
{
printf("Donner un entier : ");
scanf("%d",&x);
inserer_apres_dernier(L,x);
}
}
/****Fonction TAILLE***/
int taille(struct liste L)
{
struct cellule * p;
unsigned t=0;
if(liste_vide(L))
return(0);
else
{
p=L.premier;
while(p!=NULL)
{
p=p->suivant;
t++;
}
return(t);
}
}
/**** Fonction recherche_référence****/
struct cellule * recherche_reference(struct liste L , int x)
{
struct cellule * p=L.premier;
while (p)
if(p->info==x)
return p;
else
p=p->suivant;
return NULL;
}
/***Fonction affiche***/
void affiche(struct liste L)
{
struct cellule *q=L.premier;
if( liste_vide(L))
printf("Liste Vide");
else
while(q!=NULL)
{
printf("%d ",q->info);
q=q->suivant;
}
printf("\n");
}
/****Fonction insertion après élément référencée*****/
void inserer_apres_reference(struct cellule * p, int x)
{
struct cellule *q;
q = (struct cellule*)malloc(sizeof(struct cellule));
q->info = x;
q->suivant = p->suivant ;
p->suivant=q;
}
/****Fonction insertion avant élément référencée*****/
void inserer_avant_reference(struct cellule * p, int x)
{
struct cellule *q;
q = (struct cellule*)malloc(sizeof(struct cellule));
*q = *p;
p->info = x ;
p->suivant=q;
}
/*****Fonction suppression du premier élément****/
void supprimer_premier( struct liste * L)
{
struct cellule * s;
s= L->premier;
L->premier = s->suivant;
free(s);
/* exception une liste formée d’un seul élément */
if(L->premier ==NULL)
L->dernier=NULL;
}
/*****Fonction suppression du dernier élément****/
void supprimer_dernier( struct liste * L)
{
struct cellule * p; /*pour parcourir ll */
if(L->premier==L->dernier) /* liste formé d’un seul élément*/
supprimer_premier(L);
else
{
p=L->premier;
while(p->suivant!= L->dernier)
p=p->suivant;
p->suivant=NULL; /* mise à jour */
free(L->dernier); /* libérer le dernier */
L->dernier=p; /* mise à jour */
}
}
/*****Fonction suppression d’un élément référencée******/
void supprimer_element_reference( struct cellule *p)
{
struct cellule *q;
q=p->suivant;
*p=*q;
free(q);
}
/*****Fonction supprimer_apres_reference******/
void supprimer_apres_reference(struct cellule *p)
{
struct cellule * q=p->suivant;
p->suivant=q->suivant;
free(q);
}
/***********************************************/
/*** Question 1 exercice 2***/
void CreerTabListe ( )
{
unsigned i;
for ( i=0; i < N; i++)
creer_liste(&TabListe[i]);
}
/*** Question 2 exercice 2***/
unsigned TabListeVide ( )
{
unsigned i;
for (i = 0; i < N; i++)
if (!liste_vide(TabListe[i]))
return 0;
return 1;
}
/*** Question 3 exercice 2***/
void RemplirTabListe ( )
{
unsigned i,j;
int nombre;
srand(time(NULL));
for ( i= 0; i < N; i++)
for (j = 0; j < 5; j++)
{
do
{
nombre = rand()%9991+10;
}while(nombre%10!=i);
inserer_apres_dernier(&TabListe[i], nombre);
}
}
/*** Question 4 exercice 2***/
void AfficheTabListe ( )
{
unsigned i;
for (i = 0; i < N; i++)
{
printf("Liste %d : ", i);
affiche(TabListe[i]);
}
}
/*** Question 5 exercice 2***/
unsigned fff(int x)
{
return x%N;
}
unsigned fff2(int x)
{
return (x*2)%N;
}
void AjouterElement (int x, unsigned (*Oper) (int) )
{
unsigned indice = (*Oper)(x);
inserer_apres_dernier(&TabListe[indice], x);
}
/*** Question 6 exercice 2***/
struct cellule* Rechercher (int x, unsigned (*Oper) (int) )
{
unsigned indice = Oper(x);
return recherche_reference(TabListe[indice], x);
}
/*** Question 7 exercice 2***/
void SuppElement (int x, unsigned (*Oper) (int) )
{
unsigned indice = Oper(x);
struct cellule *p = recherche_reference(TabListe[indice], x);
if (p)
{
if (p == TabListe[indice].premier)
supprimer_premier(&TabListe[indice]);
else
if (p == TabListe[indice].dernier)
supprimer_dernier(&TabListe[indice]);
else
supprimer_element_reference(p);
}
else
printf("\n%d n'existe pas dans la liste\n",x);
}
/*** Question 8 exercice 2***/
struct liste Transvider ( )
{
struct liste L;
unsigned i;
struct cellule *p;
creer_liste(&L);
for (i = 0; i < N; i++)
{
p = TabListe[i].premier;
while (p != NULL)
{
inserer_apres_dernier(&L, p->info);
p = p->suivant;
}
}
return L;
}
int main()
{
int x;
struct cellule * p;
struct liste L;
/***Test de la question 1***/
CreerTabListe ( );
/***Test de la question 3***/
RemplirTabListe ( );
/***Test de la question 4***/
AfficheTabListe ( );
/***Test de la question 5***/
x = 2236;
AjouterElement(x, fff);
printf("\nAjout de l'élément %d dans la liste %d\n", x, fff(x));
AfficheTabListe();
/***Test de la question 6***/
// Recherche d'un élément
x = 2236;
p = Rechercher(x, fff);
if (p != NULL)
printf("\nL'élément %d se trouve dans la liste %d à partir de l'adresse %p\
n", x, fff(x),p);
else
printf("\nL'élément %d n'est pas présent dans la structure TabListe\n", x);
/***Test de la question 7***/
// Suppression d'un élément
x = 1356;
SuppElement(x, fff);
printf("\nSuppression de l'élément %d de la liste %d\n", x, fff(x));
AfficheTabListe();
/***Test de la question 8***/
// Création d'une liste transvidée
L = Transvider();
printf("Liste transvidée\n");
affiche(L);
}