Prog en C avec listes chainées

Fermé
£udo Messages postés 455 Date d'inscription mardi 8 juin 2004 Statut Membre Dernière intervention 19 décembre 2006 - 28 déc. 2004 à 18:26
£udo Messages postés 455 Date d'inscription mardi 8 juin 2004 Statut Membre Dernière intervention 19 décembre 2006 - 28 déc. 2004 à 19:04
salut ,
voila un code en C que j' ai fait qui comprend les listes chainées. Il marche mais j' ai pas parfois des erreurs quand je le lance avec borland. Et a enregistre bien dans le fichier.
#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<string.h>


FILE *CreaFichier; //fichier où l' on enregistre les données


    //definition de la structure Seleve
    struct Seleve
    {
        char nom [20];
        char prenom[20];
        char classe[5];
        Seleve *suivant;//suivant un pointeur qui pointe sur la liste
    }Releve;





void menu();


void saisie_pers()
{
  char rep;
  struct Seleve *nouveau; //nouveau pointe sur la structure
  struct Seleve *tete;  //tete pointe sur la structure
  struct Seleve * pCourant; //pCourant pointe sur la structure


  CreaFichier=fopen("CreaFichier","a");
  rep='o';
  while(rep=='o')
  {
        clrscr();
        //parcours de la liste chainée jusqu' à la fin
        if (tete != NULL)
        {
            pCourant = tete;

            while (pCourant->suivant != NULL)
            {
             pCourant = pCourant->suivant;
            }//fin du 2eme while

            
             //allocation de memoire pour le nouvel eleve à inserer
             nouveau=(Seleve*)malloc(sizeof(struct Seleve));

             printf ("Entrez le nom de l' eleve:");
             scanf  ("%s",Releve.nom);
             printf ("Entrez le prenom de l' eleve:");
             scanf  ("%s",Releve.prenom);
             printf ("Entrez la classe de l' eleve:");
             scanf  ("%s",Releve.classe);


             //pointeur courant pointe sur le nouvel element
             pCourant->suivant = nouveau;

             //le nouvel element pointe sur NULL
             nouveau->suivant = NULL;

             //on ecrit sur le fichier
             fwrite (&Releve,sizeof(Releve),1,CreaFichier);
             printf("Saisir un nouvel eleve ?");
             scanf("%c",&rep);

         }//fin du if

  }//fin du 1er while
}
void voir_pers()
{
   clrscr();
   //ouverture du fichier
   CreaFichier = fopen ("CreaFichier","r");

    if  (CreaFichier != NULL)
        {
          //lecture du fichier
          fread (&Releve, sizeof(Releve), 1,CreaFichier) ;

        //tant qu' on arrive pas à la fin du fichier, on le lit
         while (!feof(CreaFichier))
         {
            printf("\tNom : %s\n", Releve.nom);
            printf("\tPrenom : %s\n",Releve.prenom);
            printf("\tClasse : %s\n",Releve.classe);
            printf("------------------------------------------------------\n");
            getch();
            fread (&Releve, sizeof(Releve), 1,CreaFichier) ;
         }//fin du while

             fclose(CreaFichier);
             menu();
         }//fin du if
     else
         {
          printf("Il n'y a pas d' eleve dans la base...\n\n");
          printf ("Appuyer sur une touche pour retourner sur le menu principal...");
          getch();
          menu();

         }


}



void menu()
{
  clrscr();
  int choix;


  printf("\t\t****************************\n\n\n");
  printf("\t\t1. Saisie d' un nouvel eleve\n");
  printf("\t\t2. Consultation des eleves enregistres\n\n");
  printf("\t\t****************************\n");
  scanf("%d",&choix);

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

     case(2):
     voir_pers();
  }

}
void main ()
{

    menu();
    getch();
}
 


il y a des choses que je comprends pas comme
pCourant = pCourant->suivant;

ça veut dire quoi, d' ou sort cette forme de saisie (si c'est ça).

Sinon comment je pourrai faire pour suprimer un eleve et aussi pour le modifier. Dois je utiliser de nouvelles structures ?

Merci d' avance
(¯`·.¸¸.-> £udo <-.¸¸.·´¯)

2 réponses

apox Messages postés 26 Date d'inscription mardi 8 juin 2004 Statut Membre Dernière intervention 16 janvier 2006 10
28 déc. 2004 à 18:35
Salut

pCourant = pCourant->suivant;

C'est le principe des listes chainées.
Ca veut dire que tu passes a l'élement suivant de ta liste chainée.

Pour supprimer un eleve ou modifier sa fiche , t'as pas besoin du tout de créer un autre structure, il faut modifier les parametres de l'éleve concerné.

Crée d' autres méthodes que tu appelera dans ton main a travers ton switch et parcour ta liste chainée afin de trouver la ficher de l'éleve a modifier ou supprimer. Puis ben ... il te reste plus qu'a implémenter la mofication du chainage..

Un conseil, essaie plutôt de tapper le code ou lieu de le pomper ;-)
Bonne chance
++
0
£udo Messages postés 455 Date d'inscription mardi 8 juin 2004 Statut Membre Dernière intervention 19 décembre 2006 16
28 déc. 2004 à 19:04
ok merci .

mais je ne pompe pas le code, je l' integre a celui que j' ai car on m' a dit que les listes chainées sont plus simples que les fichiers quand on veut supprimer un eleve

merci

(¯`·.¸¸.-> £udo <-.¸¸.·´¯)
0