liste simple avec 2 pointeurs sur le premier et le dernier elements
liste simple avec 2 pointeurs sur le premier et le dernier elements - C++ - Programmation
MarshPosté le 29-05-2007 à 18:35:11
salut..SVP j'ai besoin de votre aide...j'arrive pas à executer ce programme..malgré que la compilation est correcte struct liste {int val; struct liste *suiv; }; typedef struct liste LISTE ; struct pointeur {LISTE *first; LISTE *last;}; typedef struct pointeur POINTEUR; POINTEUR *temp; #include <stdio.h> #include <conio.h> #include <stdlib.h> enum commande {en_tete=1,en_queue=2,milieu=3,supprimer=4,affichage1=5,liberation=6}c;
Marsh Posté le 29-05-2007 à 18:35:11
salut..SVP j'ai besoin de votre aide...j'arrive pas à executer ce programme..malgré que la compilation est correcte
struct liste
{int val;
struct liste *suiv;
};
typedef struct liste LISTE ;
struct pointeur
{LISTE *first;
LISTE *last;};
typedef struct pointeur POINTEUR;
POINTEUR *temp;
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
enum commande {en_tete=1,en_queue=2,milieu=3,supprimer=4,affichage1=5,liberation=6}c;
/////////////////////////////////////////////////////////////////////////
LISTE *recherche_element(POINTEUR *temp,int v)
{LISTE *r;
r=temp->first;
for( ;r&&((r->val)!=v);r=r->suiv);
return(r);
}
////////////////////////////////////////////////////////////////////////////
int lecture()
{int v;
printf(" donner une valeur\n" );
scanf("%d",&v);
return(v);
}
///////////////////////////////////////////////////////////////////////
POINTEUR *ceer_liste ()//c'est une insertion en queue
{POINTEUR *temp;LISTE *prev,*p;
int valeur;
temp->first=NULL;
temp->last=NULL;
while ( (valeur=lecture())!= 0)
{
p=(LISTE*)malloc (sizeof (LISTE));
p->val=valeur;
p->suiv=NULL;
if (!temp->first)
{ temp->first =p;
temp->last=p;}
else
prev->suiv=p;
prev =p;
temp->last=prev;
}
return(temp);
}
//////////////////////////////////////////////
POINTEUR* inserer_en_tete(POINTEUR *temp)
{
LISTE *d;
int tete;
do
{printf("donner la valeur a ajouter au premier element\n" );
scanf("%d",&tete);}
while(tete==0);
d=(LISTE*)malloc (sizeof(LISTE));
d->val=tete;
d->suiv = temp->first;
temp->first=d;
return (temp);
}
//**********************************************************
void affichage(POINTEUR *temp)
{LISTE *q;
q=temp->first;
while (q)
{printf("%d\t",q->val);
q=q->suiv;
}
}
////////////////////////////////////////////////////////////////////////
void liberer_une_liste(POINTEUR *temp)
{LISTE *p,*t;
for (p=temp->first;p
{
t=p->suiv;
free(p);
p=t;
}
free(temp->last);
}
////////////////////////////////////////////////////////////////////////
LISTE *recherche_precedent(POINTEUR *temp, LISTE *p)
{LISTE *rp;
rp=temp->first;
for ( ;rp&&((rp->suiv)!=p);rp=rp->suiv);
return(rp);
}
//////////////////////////////////////////////////////////////////////////
int suppression_element(POINTEUR *temp)
{LISTE *p,*pp;
int v;
if ((v=lecture())!=0)
if(!(p=recherche_element(temp,v)))
{printf("\n\nl'element n'éxiste pas\n" );
return(0);}
else
{
if(p==(temp->first))
temp->first=p->suiv;
else
{ if (p==(temp->last))
{ pp=recherche_precedent(temp,p);
temp->last=pp; }
else
{pp=recherche_precedent(temp,p);
pp->suiv=p->suiv;
}}
free(p);
return(1);
} return(1);
}
/////////////////////////////////////////////////////////////////////////////
LISTE *dernier_element(POINTEUR *temp)
{LISTE *de;
de=temp->first;
for( ;de &&(de->suiv);de=de->suiv);
return(de);
}
/////////////////////////////////////////////////////////////////////////////
LISTE *recherche_precedent_valeur(POINTEUR *temp,int v)
{LISTE *rpv;
rpv=temp->first;
for( ;rpv&&((rpv->val)<v);rpv=rpv->suiv);
return(rpv);
}
//////////////////////////////////////////////////////////////////////////////
void inserer_milieu(POINTEUR *temp)
{LISTE *nouv,*p,*pp,*dernier;int v;
if ((v=lecture())!=0)
{ nouv=(LISTE*)malloc(sizeof(LISTE));
nouv->val=v;
if (p=recherche_precedent_valeur (temp,v))
{ if(p==temp->first)
{nouv->suiv=temp->first;
temp->first=nouv;
}
else
{ if(p==temp->last)
{nouv->suiv=NULL;
pp->suiv=nouv;
temp->last=nouv;}
else
{pp=recherche_precedent(temp,p);
pp->suiv=nouv; /*nouv->suiv=p;*/
nouv->suiv=p;/*p=nouv*/
}
}
}
}
}
///////////////////////////////////////////////////////////////////////////////
void insertion_fin(POINTEUR *temp)
{LISTE *dernier,*d;int v;
if ((v=lecture())!=0)
{ dernier=temp->last;
d=(LISTE*)malloc(sizeof(LISTE));
d->val=v;
d->suiv=NULL;
dernier->suiv=d;
temp->last=d;
}
}
//////////////////////////////////////////////////////////////////////////////////
main()
{LISTE *first,*last,*r;LISTE **first1;
POINTEUR *temp;
int v,q;
printf(" *************************************************************\n" );
printf(" * programmation *\n" );
printf(" *************************************************************\n\n\n\n\n\n " );
printf(" ----------creation de liste chainee simple------------\n\n\n\n\n\n" );
temp=ceer_liste ();
*first1=first;
do
{
printf("\n\n1/ Ajout d'un élément au début\n \n" );
printf("2/ Ajout d'un élément à la fin\n\n" );
printf("3/ Ajout d'un élément au milieu\n\n" );
printf("4/ Suppression d'un élément\n\n " );
printf("5/ affichage\n\n" );
printf("6/ Libe ration de la liste\n\n" );
printf("7/ quitter\n\n\n\n" );
printf(" Entrer une comande\n" );
scanf("%d",&q);
if((q>=1)||(q<=6))
{
c=(enum commande)q;
switch(c)
{
case en_tete:
temp=inserer_en_tete(temp);
*first1=first;
break;
case en_queue:
insertion_fin(temp);
*first1=first;
break;
case milieu:
inserer_milieu(temp);
*first1=first;
break;
case supprimer:
suppression_element(temp);
*first1=first;
break;
case affichage1:
affichage(temp);
break;
case liberation:
liberer_une_liste(temp);
break;
}
}
else
printf("** ** taper un numero entre 1 et 6 ** **\n\n" );
}
while(q!=7);
printf("\n\n\n\n\n\n\n\n ****************************************************************************\n" );
printf(" * appuier sur une touche pour quitter *\n" );
printf(" ****************************************************************************\n\n\n\n " );
getch();
}
/////////////////////
heeeeelp please