Vous êtes sur la page 1sur 9

#include <stdio.

h>
#include <stdlib.h>

typedef struct Maillon{


int valeur;
struct Maillon* suivant;
}maillon;

typedef struct Maillon* LISTE;

LISTE initialiser()
{
LISTE tete;
tete=NULL;
return tete;
}

int EstListeVide(LISTE tete){


if(tete== NULL)
return 1;
else
return 0;
}

maillon * creerMaillon(int v){


maillon *m;
m=(maillon *) malloc(sizeof(maillon));
if(m!=NULL){
m->valeur=v;
m->suivant=NULL;
}
return m;
}

int longListe(LISTE tete){// version itérative


maillon *m;
int nbr=0;
m=tete;
while(m!=NULL){
nbr++;
m=m->suivant;
}
return nbr;
}

int longListe2(LISTE tete)// version récurssive


{
if(EstListeVide(tete)==1)
return 0;
else
return 1+longListe(tete->suivant);
}

void afficheListe(LISTE tete){


maillon* m;
if (tete==NULL)
printf("Liset est vide \n \n\n");
else{
m=tete;
while(m!=NULL)
{
printf("\n %d",m->valeur);
m=m->suivant;
}
}
}

// cette fontcion retourne un pointeur sur la première occurrence


de l'élément ou NULL s'il n'exite pas
maillon* recherche(LISTE tete,int v){
maillon* par;
par=tete;
while(par!=NULL)
{
if(par->valeur==v)
return par;
par=par->suivant;
}
return NULL;
}

maillon* Predecesseur (LISTE tete ,int v){


maillon *pred=NULL;
maillon *ptr=tete ;
while(ptr!=NULL&& ptr->valeur!=v)
{
pred=ptr;
ptr=ptr->suivant;
}
if(ptr!= NULL)
return pred;
else
return NULL;
}

// la fonction insererTete retourne 1 si l'élément est inséré au


début de la liste sans problème 0 sinon
// on fait un passage par adresse de la liste tete
int insererTete (LISTE *tete, int V)
{
maillon* m;
m = creerMaillon(V) ;
if(m!=NULL){
m->suivant = *tete;
*tete =m;
return 1;
}
return 0;
}

int insererQueue(LISTE * tete, int V){


maillon *m, *ptr;
m=creerMaillon(V);
if(m!=NULL) {
if(!EstListeVide(*tete)){
ptr=*tete ;
while(ptr->suivant!=NULL)
ptr=ptr->suivant;
ptr->suivant =m;// à la fin de la boucle
}
else
*tete =m;
return 1;
}
return 0;
}

void saisieQueue(LISTE* tete){// ajoueter des éléments à la fin de


la liste
int n,i,v;
int r;
*tete=initialiser();
printf("Donner le nombre d'elements a ajouer a la liste:");
scanf("%d",&n);
for(i=1;i<=n;i++){
printf("\n\nDonner la valeur de l'element %d:",i);
scanf("%d",&v);
r=insererQueue(&(*tete),v);

if(r==1)
printf("\n\n element est joute avec succes\n\n");
else
printf("\n\n Erreur : element n'est pas joute à la liste
!!!\n\n");
}
}

int InsererQueue_ordonee(LISTE *tete, int V) {


maillon* m,*ptr,*par;
m=creerMaillon(V);
if(m!=NULL) {
if(EstListeVide(*tete)){
*tete =m;// liste vide
}
else{
if((*tete)->valeur>V) { // inserer au debut
m->suivant = *tete ; *tete = m;
}
else{
par=(*tete)->suivant ;// on cherche la
première occurence palce convenable
while(par->valeur<V){
ptr= par;
par = par->suivant;
}
m->suivant = ptr->suivant;
ptr->suivant = m;
}
}
return 1;
}
return 0;
}

int SupprimerTete(LISTE *tete){


maillon* m;
if(!EstListeVide(*tete)){
m=*tete;
*tete=(*tete)->suivant;
free(m);
return 1;
}
return 0;
}

int supprimerQueue(LISTE *tete){


maillon* m,*ptr;
if ((*tete)->suivant!=NULL){ // plus de 2 elements dans la liste
ptr=*tete;
while(ptr->suivant->suivant!=NULL)
ptr=ptr->suivant;
m=ptr->suivant;
ptr->suivant=NULL;
free(m);
return 1;
}
else
if((*tete)->suivant==NULL) { // 1 seul element dans la liste
m=*tete;
*tete=NULL;
free(m);
return 1;
}
return 0;
}

// supprime la premiere occurrence d'un élément quelconque de la


liste
int supprimerElement(LISTE *tete,int v){
maillon *m, *ptr;

if ((*tete)->valeur=v){// la valeur se trouve en tete de la


liste
m=*tete;
*tete=(*tete)->suivant;
free(m);
return 1;
}
if ((*tete)->suivant!=NULL){// la valeur se trouve ailleur
de la tete de la liste
ptr=*tete;
while(ptr->suivant->valeur!=v)
ptr=ptr->suivant;
m=ptr->suivant;
ptr->suivant= m->suivant;
free(m);
return 1;
}
return 0;
}

// deuxième solution pour la suppression d'un élément quelconque


int supprimerElement2(LISTE *tete,int v){
maillon *m, *ptr;
if(*tete==NULL) //liste vide
return -1;
else{
if((*tete)->suivant==NULL){ // liste contient un
élement
if((*tete)->valeur==v){// lelement existe
*tete=NULL;
return 1;
}
return 0; // lelement n'existe pas
}
else{//liste contient au moins 2 élément
if ((*tete)->valeur==v){// la valeur se trouve en tete
de la liste
m=*tete;
*tete=(*tete)->suivant;
free(m);
return 1;
}
ptr=(*tete)->suivant; m=*tete;//// la valeur se
trouve ailleur de la tete de la liste
while(ptr!=NULL && ptr->valeur!=v ){
m=ptr;
ptr=ptr->suivant;
}
if(ptr!=NULL ){// lelement existe
m->suivant=ptr->suivant;
free(ptr);
return 1;
}
return 0;// lelement n'existe pas
}
}
}

void menu(LISTE *liste){


int rep,r,n;
LISTE p;
do{
do{
system("cls");
printf("\n \t\t\t Gestion d'une liste chainee\n");
printf("\t\t\t ===============================\n");
printf("\n \t 1. Liste Vide ?\n");
printf("\n \t 2. Saisie\n");
printf("\n \t 3. Rechercher la premiere occurence d un
element ? \n");
printf("\n \t 4. Rechercher le predecesseur de la premiere
occurence d un element ? \n");
printf("\n \t 5. Affichage de la liste\n");
printf("\n \t 6. Ajout En Queue de liste\n");
printf("\n \t 7. Ajout En Tete de la liste\n");
printf("\n \t 8. Suppression de la Tete de la liste\n");
printf("\n \t 9. Suppression de la Queue de la liste\n");
printf("\n \t 10. Suppression d un element quelconque\n");
printf("\n \t 11. Longueur de la liste de la liste par la
vesrion iterative \n");
printf("\n \t 12. Longueur de la liste de la liste par la
vesrion recurssive\n");
printf("\n \t 0. Quitter le programme\n");
printf("\n\n Taper votre choix
(0/1/2/3/4/5/6/7/9/10/11/12):");
scanf("%d",&rep);
}while (rep!=0&&rep!=1&& rep!=2 && rep!=3 && rep!=4 && rep!
=5&& rep!=6 && rep!=7&& rep!=8&& rep!=9 && rep!=10&& rep!=11&&
rep!=12);
switch(rep){
case 1: system("cls");
printf("\n \t\t\t Test de la liste chainee Vide
? \n");
if (EstListeVide(*liste))
printf ("\n\n\n La liste est Vide\n");
else
printf ("\n\n\n La Liste est non Vide\n");
printf("\n\n\n\n\n\n Taper un caractere pour
revenir au menu");getchar();getchar();
break;
case 2: system("cls");
printf("\n \t\t\t Saisie de la liste chainee\n");

saisieQueue(&(*liste));
printf("\n\n\n\n\n\n Taper un caractere pour
revenir au menu");getchar();getchar();
break;
case 3: system("cls");
printf("\n Rechercher la premiere occurence d'un
element ?\n");
printf("\n \n\n Donner l element a
rechercher :");scanf("%d",&n);
if (recherche(*liste,n)!=NULL)
printf ("\n\n\n L'element %d existe dans la
liste\n",n);
else
printf ("\n\n\n L'element %d n existe pas
dans la liste\n",n);
printf("\n\n\n\n\n\n Taper un caractere pour
revenir au menu");getchar();getchar();
break;
case 4: system("cls");
printf("\n Rechercher le predecesseur de la
premiere occurence d'un element ? ?\n");
printf("\n n\n Donner l'element a inserer
en queue de la liste :");scanf("%d",&n);
p=Predecesseur(*liste,n);
if (p!=NULL)
printf ("\n\n\n Le predecesseur de
l'element %d est %d\n",n,p->valeur);
else
printf ("\n\n\n Le predecesseur de
l'element %d n'existe pas",n);
printf("\n\n\n\n\n\n Taper un caractere pour
revenir au menu");getchar();getchar();
break;

case 5:system("cls");
printf("\n \t\t\t Affichage de la liste chainee\
n");
afficheListe(*liste);
printf("\n\n\n\n\n\n Taper un caractere pour
revenir au menu");getchar();getchar();
break;

case 6:system("cls");
printf("\n \t Ajout d'un element a la Queue de la
liste chainee\n");
printf("\n n\n Donner l'element a inserer
en queue de la liste :");scanf("%d",&n);
if (insererQueue(&(*liste),n)==1)
printf("\n\n l'element %d est ajoute a la tete
avec succees\n",n);
else
printf("\n\n l'element %d n est pas ajoute a la
tete\n",n);
printf("\n\n\n\n\n\n Taper un caractere pour
revenir au menu");getchar();getchar();
break;
case 7:system("cls");
printf("\n \t Ajout d'un element a la Tete de la
liste chainee\n");
printf("\n \n\n Donner l'element a insere en
tete de la liste chainee:");scanf("%d",&n);
if (insererTete(&(*liste),n)==1)
printf("\n\n l'element %d est ajoute a la tete
avec succees\n",n);
else
printf("\n\n l'element %d n est pas ajoute a la
tete\n",n);
printf("\n\n\n\n\n\n Taper un caractere pour
revenir au menu");getchar();getchar();
break;
case 8:system("cls");
printf("\n \t Suppression de l'element se
trouvant a la tete de la liste chainee\n");
if (SupprimerTete(&(*liste))==1)
printf("\n\n la tete est supprimee avec
succees");
else
printf("\n\n la liste est vide !!");
printf("\n\n\n\n\n\n Taper un caractere
pour revenir au menu");getchar();getchar();
break;
case 9:system("cls");
printf("\n \t Suppression de l'element se
trouvant a la queue de la liste chainee\n");
if(supprimerQueue(&(*liste))==1)
printf("\n\n la queue est supprimee avec
succees");
else
printf("\n\n la liste est vide !!");
printf("\n\n\n\n\n\n Taper un caractere pour
revenir au menu");getchar();getchar();
break;
case 10:system("cls");
printf("\n \t Suppression d'un element quelconque
de la liste chainee\n");
printf("\n \n\n Donner l'element a
supprimer :");scanf("%d",&n);
if (supprimerElement2(&(*liste),n)==1)
printf("\n \n la premiere occurrence de
l element %d est supprime avec sucees",n);
else
printf("\n \n L'element %d n'existe pas dans la
liste ",n);
printf("\n\n\n\n\n\n Taper un caractere pour
revenir au menu");getchar();getchar();
break;
case 11:system("cls");
printf("\n \t Longueur de la liste calcule par la
methode iterative\n");
printf("\n \n la longueur de la liste est
%d",longListe(*liste));
printf("\n\n\n\n\n\n Taper un caractere pour
revenir au menu");getchar();getchar();
break;
case 12:system("cls");
printf("\n \t Longueur de la liste calcule par la
methode recurssive\n");
printf("\n \n la longueur de la liste est
%d",longListe2(*liste));
printf("\n\n\n\n\n\n Taper un caractere pour
revenir au menu");getchar();getchar();
break;
case 0:break;
}
}while(!(rep==0));
printf("\n Fin du programme\n");
getchar();
}

main(){
int r;
LISTE L;
L=initialiser();
menu(&L);
free(L);
}

Vous aimerez peut-être aussi