Liste chainée

Signaler
Messages postés
71
Date d'inscription
vendredi 2 juin 2006
Statut
Membre
Dernière intervention
7 octobre 2011
-
Messages postés
416
Date d'inscription
vendredi 31 janvier 2003
Statut
Membre
Dernière intervention
19 décembre 2013
-
bonjour à tous j'ai besoin que quelqu'un m'aide SVP à voir la faille dans un programme que j'ai écris. je n'arrive pas à afficher les chaines; de caractères , les float et à afficher les informations que j'insère quand je lance le menu insérer. Aider moi SVP à y voir clair.
merci

#include<stdio.h>
#include<conio.h>
#include
#include<ctype.h>
#include<stdio.h>




struct article
{
int codeart;
char *nom;
float prix;
article *suivant;
};


struct magasin
{
int codemag;
char *nom;
char *adresse;
article *suivantart;
magasin *suivant;
};




struct ville
{
int codeville;
char *nom;
ville *suivant;
magasin *suivantmag;
};


article * creer_article ()
{
int i,n;
float prix;
char *nom;
article *art,*debut_art;
debut_art=NULL;


printf("\n\n.......................CREATION D'UN ARTICLE........................\n\n");


printf("\n Entrer le nombre d'articles que vous voulez cr‚er: ");
scanf("%d",&n);


 for(i=1;i<=n;i++)
   {


   art=(article *)malloc(sizeof(article));


   printf("\n Entrer le code de r‚f‚rence de l'article: ");
   scanf("%d",&art->codeart);


   art->suivant=debut_art;
   debut_art=art;


   }
 return debut_art;
}


 


magasin * creer_magasin ()
{
int i,n;
char *nomm;
magasin *m,*debut_mag;
magasin *suivantart;
debut_mag=NULL;


printf("\n\n.......................CREATION D'UN MAGASIN........................\n\n");


printf("\n Entrer le nombre de magasin que vous voulez cr‚er: ");
scanf("%d",&n);


 for(i=1;i<=n;i++)
   {


   m=(magasin *)malloc(sizeof(magasin));


   printf("\n Entrer le code de r‚f‚rence du magasin: ");
   scanf("%d",&m->codemag);




   m->suivant=debut_mag;
   debut_mag=m;
   m->suivantart=creer_article();


   }
 return debut_mag;
}


 


ville * creer_ville ()
{
int i,n;
char *nomv;
ville *v,*debut_ville;
ville *suivantmag;
debut_ville=NULL;


printf("\n\n.......................CREATION D'UNE VILLE.......................\n\n");


printf("\n Entrer le nombre de ville que vous voulez cr‚er: ");
scanf("%d",&n);


 for(i=1;i<=n;i++)
   {


   v=(ville *)malloc(sizeof(ville));


   printf("\n Entrer le code de r‚f‚rence de la ville: ");
   scanf("%d",&v->codeville);


   v->suivant=debut_ville;
   debut_ville=v;
   v -> suivantmag = creer_magasin();


   }
 return debut_ville;
}




article * inserer_article()
{
int x,n,i,codeart;
char *nom;
float prix;
article *art,*p, *q,*suivant,*debut_art;


   art=(article *)malloc(sizeof(article));


   printf("\n\n...........................INSERTION D'UN ARTICLE.............................");


   printf("\n\n Combien darticles voulez vous ins‚rer dans la liste?: ");
   scanf("%d",&n);


       for(i=1;i<=n;i++)
  {
   printf("\n Entrer le num‚ro … ins‚rer: ");
   scanf("%d",&x);


       //   art->codeart=x;


      if(debut_art!=NULL)
       {
  if(debut_art->codeart>x)
   {
   art->suivant=debut_art;
   debut_art=art;
   }
  else
   {
    p=debut_art;


      while( (p!=NULL) && (p->codeart>x) )
        {
        q=p;
        p=p->suivant;
        }
  //       if(debut_art->codeart==x)
  //      {
  //      printf("\n Cet enregistrement existe d‚j… dans la liste");
  //      }
  //      else
  //      {
        art->suivant=p;
        q->suivant=art;
  //      }
  }
       }
      else
       {
       debut_art=art;
       art->suivant=NULL;
       }


  }
    return debut_art;
}


 


magasin * inserer_magasin()
{
int x,n,codemag,i;
char *nom;
char *adresse;
magasin *m,*p, *q,*debut_mag,*suivant,*suivantart;


   m=(magasin *)malloc(sizeof(magasin));


   printf("\n\n...........................INSERTION D'UN MAGASIN............................");


   printf("\n\n Combien de magasins voulez vous ins‚rer dans la liste?: ");
   scanf("%d",&n);


       for(i=1;i<=n;i++)
  {
   printf("\n Entrer le num‚ro … ins‚rer: ");
   scanf("%d",&x);


       //   m->codemag=x;


      if(debut_mag!=NULL)
       {
  if(debut_mag->codemag>x)
   {
   m->suivant=debut_mag;
   debut_mag=m;
   }
  else
   {
    p=debut_mag;


      while( (p!=NULL) && (p->codemag>x) )
        {
        q=p;
        p=p->suivant;
        }


      //   if(debut_mag->codemag==x)
     //   {
    //    printf("\n Cet enregistrement existe d‚j… dans la liste");
     //   }
    //    else
    //    {
        m->suivant=p;
        q->suivant=m;
     //   }
   }
       }
      else
       {
       debut_mag=m;
       m->suivant=NULL;
       }
       // printf("\n Voulez vous ajouter un article dans ce magasin? ");
       // scanf("%c",&rep);
      //  if(rep)
      //  {
        m->suivantart= inserer_article();
      //  }
  }
    return debut_mag;
}




ville * inserer_ville()
{
int x,n,i,codeville;
char *nom;
ville *v,*p, *q,*suivant,*debut_ville;




   v=(ville *)malloc(sizeof(ville));


   printf("\n\n...........................INSERTION D'UNE VILLE.............................");


   printf("\n\n Combien de ville voulez vous ins‚rer dans la liste?: ");
   scanf("%d",&n);


       for(i=1;i<=n;i++)
  {
   printf("\n Entrer le code de la ville … ins‚rer: ");
   scanf("%d",&x);


 //  v->codeville=x;




      if(debut_ville!=NULL)
       {
  if(debut_ville->codeville>x)
   {
   v->suivant=debut_ville;
   debut_ville=v;
   }
  else
   {
    p=debut_ville;


      while( (p!=NULL) && (p->codeville>x) )
        {
        q=p;
        p=p->suivant;
        }
     //   if(debut_ville->codeville==x)
    //    {
     //   printf("\n Cet enregistrement existe d‚j… dans la liste");
    //    }
     //   else
    //    {
        v->suivant=p;
        q->suivant=v;
    //    }
  }
       }
      else
       {
       debut_ville=v;
       v->suivant=NULL;
       }
   //  printf("\n Voulez vous ajouter un magasin dans cette ville? ");
   //  scanf("%c",&rep);
   //  if(rep)
   //  {
     v->suivantmag=inserer_magasin();
   //  }
  }
    return debut_ville;
}




void afficher_ville( ville *d)
{
int i;
char *nom;
ville *v=d;
article *a;
magasin *m;


printf("\n\n.......................A F F I C H A G E..........................\n\n");


    while(v!=NULL)
      {
      printf("\n\n Le code de r‚f‚rence de la ville est : %d",v->codeville);


      m=v->suivantmag;


 while(m!=NULL)
   {
   printf("\n Le code de r‚f‚rence du magasin est : %d",m->codemag);


   a=m->suivantart;


     while(a!=NULL)
       {


       printf("\n Le code de r‚f‚rence de l'article est: %d",a->codeart);


       a=a->suivant;
       }
   m=m->suivant;
   }
      v=v->suivant;
      }
}


 


void quitter()
{


 printf("\n\n PROGRAMME TERMINER\n\n");
 printf("\n\n Tapez une touche pour quitter le programme\n\n");
 printf("....... MERCI ET A BIENTOT.......");


}




void menu2()
{
int choix;
ville *v;
article *a;
magasin *m;
     do
     {
     printf("\n\n BIENVENUE DANS LE MENU 2 DE CE PROGRAMME\n\n  ");
     printf("\n\n.....................M  E  N  U 2..........................\n\n");


     printf("\n 1. INSERER UNE VILLE\n");


     printf("\n 2. QUITTER L'APPLICATION\n");


     printf("\n ENTRER VOTRE CHOIX: ");


     scanf("%d",&choix);


 switch(choix)
   {
   case 1:
  inserer_ville();
   break;




   case 2:
   quitter();
   break;
   }
     }   while(choix!=2);


}




void menu1()
{
int choix;
ville *v;
article *a;
magasin *m;
     do
     {
     printf("\n\n BIENVENUE DANS LE MENU 1 DE CE PROGRAMME\n\n");
     printf("\n\n.....................M  E  N  U 1..........................\n\n");
     printf("\n 1. CREER UNE VILLE ET SES COMPOSANTS\n");
     printf("\n 2. AFFICHER LES ENREGISTREMENTS\n");
     printf("\n 3. INSERER DE NOUVEAUX ENREGISTREMENTS\n");
     printf("\n 4. QUITTER L'APPLICATION\n");


     printf("\n ENTRER VOTRE CHOIX: ");
     scanf("%d",&choix);


 switch(choix)
   {
   case 1:
   v=creer_ville();
   break;


   case 2:
   afficher_ville(v);
   break;


   case 3:
   menu2();
   break;


   case 4:
   quitter();
   break;
   }
     }   while(choix!=4);


}




void main()
{


clrscr();


menu1();


getch();


}

3 réponses

Messages postés
84
Date d'inscription
lundi 6 novembre 2000
Statut
Membre
Dernière intervention
25 juillet 2008
1
une petite gaterie et un mars avec ca !!
en plus ton code c du c !
pour finir, si t'avais écrit ca, tu saurais trouver l'erreur ...
donc, pomper n'est pas gagner ....
Messages postés
2671
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
2
mabrouklepoux> Si c'est pour répondre n'importe quoi autant t'abstenir. Je ne vois rien de constructif ou meme de censé dans ce que tu dis.

bossou> Lorsque tu mets un bloc de code, ca ne donne pas envie d'essayer de comprendre. Soit plus précis sur le problème que tu as, et ne mets que le bout de code concérné.

Shell
Messages postés
416
Date d'inscription
vendredi 31 janvier 2003
Statut
Membre
Dernière intervention
19 décembre 2013
2
Salut,
J'ai jete un bref coup d'oeil dans ton code et je remarque plusieurs lacunes et erreurs. Je ne vais te citer que les plus importantes qui sautent aux yeux :
1- TOUTES tes variables sont locales. ce qui fait que lorsque tu crees une ville  (par exemple) , elle est bel et bien creee , seulement tu la retournes mais aucune autre variable ne sauvegarde le debut de la liste :
      menu1()
       -- a chaque fois que tu crees une ville, la variable v pointe sur la prochaine ville creee(et celle d'avant?elle est sauvegardee ou?), ce qui fait que a l'affichage lorsque tu cherches a afficher le magasin ou la liste des villes , tu n'auras rien puisque c une ville nouvellement creee (donc vide).
     -- article *a et magasin* m ne servent a rien;

   menu2()
      --  a cause de la grosse erreur du menu1(), tu essaies d'inserer une ville dans aucune liste , puisque les variables declarees au debut de la fonction ne pointe sur rien. Tu crees une ville , et dans la boucle tu fais 2 grosses erreurs:
        - en creant la premiere ville debut_ville va pointer sur v (ton prog devrait meme crasher car ce n'est pas garantie qu'un pointeur declare mais non instancie-initialise pointe sur NULLsuivant = NULL</gras>;       - a la 2eme iteration vu que debut_ville pointe sur v , si le codeville est > x , v->suivant <gras>debut_ville et debut_ville v. </gras>Je te rappelle qu'a la 1ere erreur la ville suivante egale la ville actuelle. ce qui veut  dire en fait que tu ne vas modifier que les infos de la meme ville
       3eme erreur - lorsque le codeville< =x tu veux iterer a partir de p =debut_ville. de 2 choses l'une:              debut_ville->suivant <gras>NULL (1ere erreur) : p</gras> NULL so plus tard tu reviens a la meme chose qu'a la 2eme erreur: soit la ville suivante est la ville elle-meme.              debut_ville->suivant <gras>debut_ville(du a debut_ville v</gras>  et v->suivant = debut_ville : ) il y a un truc pas tres catholique qui va se produire : CRASH DE PROGRAMME </gras> car p = debut_ville et p->suivant = = p , et en partant (nous sommes dans le else) debut_ville->codeville<=x . so ta boucle while( p! =NULL && p->codeville>x), tu n'y entreras jamais , donc q qui ne pointe sur aucune ville , tu essaies d'acceder a sa ville suivante q->suivant=v.

     Ca c juste quelques erreurs , et yen a des tonnes similaires a celles-la. Please, relis ton programme avec attention (surtout l'algorithme), si tu es en C , utilises des variables globales ou locales a la fonction main que tu passeras en parametres dans les fonctions sous-jacentes, recuperes toujours les valeurs de retour des fonctions(sinon crees des procedures), et de grace mais de grace 3 choses: (1)initialises tes pointeurs, (2)verifies qu'ils pointent sur la bonne structure avant d'acceder aux variables et/ou fonctions membres et (3) cree des fonctions qui permettront de liberer la memoire allouee par tes fonctions creer_...

J'espere avoir aide, salut

je suis heureux de faire partie d'une grande famille ...!