Partage
  • Partager sur Facebook
  • Partager sur Twitter

Insertion Liste chainée

    21 mai 2017 à 12:57:50

    Bonjours à tous , en faisant un exercices concernant les liste simplement chainée je suis arrivé a une question qui me demande d'inserer un etudiant dans une liste chainée selon la moyenne de l'étudiant (ordre croissant) voici le code utilisé : 

    void AjouterEtudiant (EnsembleEtudiant *A,Etudiant E)
    { 
       float Moy=getMoyenne(E);
       NoeudEtd *Prec=NULL;
       NoeudEtd* Courant=(*A);
       NoeudEtd* Nouveau=(NoeudEtd*)malloc(sizeof(NoeudEtd);
       Nouveau->Etd=E;
       while(Courant!=NULL && getMoyenne(Courant->Etd)<Moy)
       {
          Prec=Courant;
          Courant=Courant->suivant;   
       }
       Nouveau->suivant=Courant;
       if(Prec)Prec->suivant=Nouveau;
       else (*A)=Nouveau;
    }

    La fonction getMoyenne retourne la moyenne d'un étudiant.

    Voici Les Structures utilisé 

    typedef struct Etudiant
    {
      char nom[20];
      int code;
      Matiere tabNote[3];
    }Etudiant;
    
    typedef struct Matiere
    {
      float Note;
      int Coeff;
    }Matiere;
    
    typedef struct NoeudEtd* EnsembleEtudiant;
    typedef struct NoeudEtd
    {
      Etudiant Etd;
      EnsembleEtudiant suivant;
    }NoeudEtd;

    Quand je compile sa me fait une segmentation fault : 11?!

    Merci d'avance


    -
    Edité par StarChadi 21 mai 2017 à 12:58:17

    • Partager sur Facebook
    • Partager sur Twitter
      21 mai 2017 à 13:52:59

      Yop,

      J'ai juste survolé rapidement, il manque une parenthèse à la ligne 6

      • Partager sur Facebook
      • Partager sur Twitter
        21 mai 2017 à 14:05:34

        Toujours le meme problème :/
        • Partager sur Facebook
        • Partager sur Twitter
          21 mai 2017 à 14:09:38

          Tu peux fournir un exemple ? Un petit programme pour essayer quoi, avec un main et les étapes précédentes :)
          • Partager sur Facebook
          • Partager sur Twitter
            21 mai 2017 à 15:02:18

            #include <stdio.h>
            #include <stdlib.h>
            #include <string.h>
            
            /*Partie A*/
            
            typedef struct Matiere
            {
                float note;
                int coeff;
            
            }Matiere;
            
            typedef struct Etudiant
            {
                int code;
                char nom[20];
                Matiere tabNote[3];
            }Etudiant;
            
            void initMatiere(Matiere *adrM,float N,int C)
            {
                adrM->note=N;
                adrM->coeff=C;
            }
            
            float getNote(Matiere M)
            {
                float Res;
                Res=M.note*M.coeff;
                return(Res);
            }
            
            void initEtudiant(Etudiant *AdrE,int c,char name[])
            {
                AdrE->code=c;
                strcpy(AdrE->nom,name);
            }
            
            void setNotes(Etudiant *AdrE,Matiere M[3])
            {
                int i;
                for(i=0;i<3;i++)
                {
                    AdrE->tabNote[i]=M[i];
                }
            }
            
            float getMoyenne(Etudiant E)
            {
                float SN=0,SC=0;
                int i;
                for(i=0;i<3;i++)
                {
                    SN+=getNote(E.tabNote[i]);
                    SC+=E.tabNote[i].coeff;
                }
                return(SN/SC);
            }
            
            void AfficherEtudiant(Etudiant E)
            {
                printf("Nom:%s\nCode:%d\nMoyenne:%.2f\n",E.nom,E.code,getMoyenne(E));
            }
            
            /*Partie B*/
            
            typedef struct NoeudEtd *EnsembleEtudiant;
            typedef struct NoeudEtd
            {
                Etudiant Etd;
                EnsembleEtudiant suivant;
            
            }NoeudEtd;
            
            void initEnsemble(EnsembleEtudiant *adrEtd)
            {
                adrEtd=NULL;
            }
            
            NoeudEtd* verifierEtudiant(EnsembleEtudiant A,Etudiant E)
            {
                NoeudEtd* Tmp=A;
                while(Tmp!=NULL)
                {
                    if(Tmp->Etd.code==E.code)
                    {
                        return(Tmp);
                    }
                    Tmp=Tmp->suivant;
                }
                return(NULL);
            }
            
            void AjouterEtudiant(EnsembleEtudiant *adrA,Etudiant E)
            {
                    float moy=getMoyenne(E);
                    NoeudEtd* Courant=(*adrA),*Prec=NULL,*Nouveau;
                    Nouveau=(NoeudEtd*)malloc(sizeof(NoeudEtd));
                    Nouveau->Etd=E;
                    while(Courant!=NULL && getMoyenne(Courant->Etd)<moy)
                    {
                        Prec=Courant;
                        Courant=Courant->suivant;
                    }
                    Nouveau->suivant=Courant;
                    if(Prec)
                    {
                        Prec->suivant=Nouveau;
                    }
                    else
                    {
                        (*adrA)=Nouveau;
                    }
            
            }
            
            void AfficherEnsemble(EnsembleEtudiant A)
            {
                EnsembleEtudiant Tmp=A;
                while(Tmp!=NULL)
                {
                    AfficherEtudiant(Tmp->Etd);
                    Tmp=Tmp->suivant;
                }
            }
            
            int main()
            {
                Etudiant E;
                EnsembleEtudiant A;
                Matiere m1,m2,m3;
                initMatiere(&m1,12,1);
                initMatiere(&m2,14,1);
                initMatiere(&m3,7.5,1);
                Matiere M[]={m1,m2,m3};
                initEtudiant(&E,1234,"hamid");
                setNotes(&E,M);
                AjouterEtudiant(&A,E);
                AfficherEnsemble(A);
            
                return 0;
            }
            
            Voici le code en intégralité

            -
            Edité par StarChadi 21 mai 2017 à 15:34:22

            • Partager sur Facebook
            • Partager sur Twitter
              21 mai 2017 à 15:13:38

              Tu as fait une fonction initEnsemble pour mettre ton pointeur à NULL, mais tu ne t'en sert pas dans ton main !

              • Partager sur Facebook
              • Partager sur Twitter
                21 mai 2017 à 15:25:44

                Je vien de le rajouter dans mon main mais sa me fais toujours une segmentation fault dans la console :/
                • Partager sur Facebook
                • Partager sur Twitter
                  21 mai 2017 à 19:56:22

                  Utilise un debugger et localise à quel l'endroit se produit le problème.
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Insertion Liste chainée

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown