thank you salem
i have got a solution
so
the problem now is to delete element in list
i have write 2 solution
the first does not work ... !
but the second is ok
all functions ......> Ok
can some one help to corerrect the first solution
here is my
Code:
#include <stdlib.h>
#include <stdio.h>
typedef struct cellule
{
int nbr;
cellule *suivant;
}cellule;
typedef cellule *liste;
/* fin */
int fin(liste l)
{
liste p;
p = l->suivant;
while ( p != NULL)
{
p = p->suivant;
l = l->suivant;
}
return(l->nbr);
}
/* new */
liste nouveau(){ return NULL; }
/* next */
liste suivant(liste l){ return l->suivant; }
/* precedent */
int precedent(liste l,int elm)
{
if( l == NULL ) return l->nbr;
liste p=l->suivant;
while ( p != NULL)
{
if( p->nbr == elm ) break;
p = p->suivant;
l = l->suivant;
}
return l->nbr;
}
/* ajout tete */
liste ajout_tete(liste l,int element)
{
liste A = ( liste )malloc( sizeof( cellule ) );
if ( A != NULL )
{
A->nbr=element;
A->suivant=l;
}
return A;
}
/* recherche par element */
liste rechercher(liste l,int element)
{
int e=0;
liste p = l;
if( l == NULL ){printf("liste Null !");return l;}
while( p != NULL )
{
if( p->nbr == element ) {e=1; break; }
p = suivant ( p );
}
if( e == 0 ){ return NULL; }
return p;
}
/* ajout fin */
liste ajout_fin(liste l,int element)
{
liste A = ( liste )malloc( sizeof( cellule ) );
A->nbr = element;
A->suivant = NULL;
if( l == NULL ){ return A; }
else
{
liste p1,p2;
p1 = l;
p2 = l->suivant;
while( p2 != NULL )
{
p1 = suivant ( p1 );
p2 = suivant ( p2 );
}
p1->suivant = A;
}
return l;
}
/* remplir tete */
liste remplir_tete(liste l)
{
int n , i , element;
while( n <= 0 )
{
printf("\n \02 Donnez nbr element a inserer par tete : ?\b ");
scanf("%i",&n);
}
for(i=0;i<n;i++)
{
printf("\n\01 Donnez element %i : ",i+1);
scanf("%i",&element);
l=ajout_tete(l,element);
}
return l;
}
/* remplir fin */
liste remplir_fin(liste l)
{
int n , i , element;
while( n <= 0 )
{
printf("\n \02 Donnez nbr element a inserer par fin : ?\b ");
scanf("%i",&n);
}
for(i=0;i<n;i++)
{
printf("\n\01 Donnez element %i : ",i+1);
scanf("%i",&element);
l=ajout_fin(l,element);
}
return l;
}
void afficher(liste l)
{
liste p = l;
printf("\n=======================================================\n");
while( p != NULL)
{
printf("%i -> ",p->nbr);
p = suivant( p );
}
printf("NULL");
printf("\n=======================================================\n");
}
/* first solution */
/* supprimer element ( succe = -1 ) */
/*
liste supprimer(liste l,int element)
{
liste p;
p = rechercher ( l , element );
if( p == NULL ){printf("\n SORRY NO ELEMENT ! \n");return l;} // si l'lelement n'existe pas
else if( p->suivant == NULL ) { p = NULL; } // si l'element est le debut
//sinon
else
{
p = p->suivant ;
}
return l;
}
*/
/* second solution */
/* supprimer element ( succe = 1 ) !! */
liste supprimer(liste l, int elm)
{
liste r,p, p1, p2;
p1=p2=p=l;
p2=p2->suivant;
// si l'element nexiste pas
if ( rechercher( l , elm ) == NULL ) {printf("\n\02 SORRY NO ELEMENT !\n");return l;}
// dans le cas ou l'element a supprimer est la tete de la liste
if ( l->nbr == elm )
{
l=l->suivant; return l;
}
// dans le cas ou l'element a supprimer est la queue de la liste
if ( elm == fin(l) )
{
while(p2!=NULL)
{
p2=p2->suivant;
p1=p1->suivant;
}
p1->suivant=NULL;
}
// sinon
while(p!=NULL)
{
if ( p->nbr == precedent(l,elm) )
{
p->suivant=p->suivant->suivant;
return l;
}
p=p->suivant;
}
}
int main()
{
int elm;
liste head,tail;
/* affectation nouvelles listes */
head = nouveau();
tail = nouveau();
/* remplissage listes */
head = remplir_tete( head );
tail = remplir_fin( tail );
/* affichage listes */
printf("Afficher head :\n ");
afficher(head);
printf("Afficher tail :\n ");
afficher(tail);
/* suppression element */
printf("Donnez elemnet a supprimer \n");
scanf("%i",&elm);
tail = supprimer( tail, elm );
printf("afficher apres suppression ");
afficher( tail );
return 0;
}