segmentation (core dumped)
bonjour,
voilà dans le cadre d'un TP pour un de mes profs, j'ai ce petit code qui permet d'ajouter des étudiants, de les afficher, d'en supprimer, et de faire un calcul de moyenne.
Néanmoins je me retrouve avec un problème de segmentation ( core dumped ) lorsque je tente un affichage. Je n'arrive pas a trouver l'erreur, c'est pourquoi je me tourne aujourd'hui vers vous =)
voici le code :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155
|
#include <stdio.h>
#include <stdlib.h>
struct etudiant
{
char *nom;
float moy;
int num;
struct etudiant *suivant;
struct etudiant *precedent;
};
typedef struct etudiant Etudiant;
Etudiant *ajout(Etudiant *etudiant)
{
Etudiant *temp;
etudiant->nom=(char*)malloc(sizeof(char));
printf("Saisir le nom de l'étudiant : ");
scanf("%s", etudiant->nom);
printf("Saisir le matricule de l'étudiant : ");
scanf("%d", &etudiant->num);
printf("Saisir la moyenne de l'étudiant : ");
scanf("%f", &etudiant->moy);
etudiant->suivant=(Etudiant*)malloc(sizeof(Etudiant));
temp = etudiant;
etudiant=etudiant->suivant;
etudiant->precedent=temp;
return (etudiant);
}
Etudiant *supprimer(Etudiant *etudiant)
{
int num = 1;
Etudiant *temp;
while (num != 0)
{
printf("Saisissez le numéro de matricule de l'étudiant absent à supprimer (0 pour terminer) : ");
scanf("%d", &num);
if (num != 0)
{
while (etudiant->suivant && (etudiant->num != num))
{
etudiant = etudiant->suivant; // on parcourt jusqu'à ce qu'on tombe sur un élément avec le numéro qui match (ou jusqu'à la fin)
}
if (etudiant->num != num) // si on a rien trouvé
{
printf("élément introuvable");
}
else
{
if (etudiant->precedent && etudiant->suivant) // suppression d'un élément normal
{
temp = etudiant->precedent;
temp->suivant = etudiant->suivant; // on prend l'élément suivant de la cellule précédente (soit la cellule actuelle) et on le remplace par l'élément suivant de la cellule actuelle
temp = etudiant->suivant;
temp->precedent = etudiant->precedent; // pareil, mais de l'autre côté. Ainsi, la cellule à supprimer ne fait plus partie de la liste
etudiant = etudiant->suivant;
}
else
{
if (etudiant->precedent==NULL) //cas du premier élément
{
etudiant = etudiant->suivant;
etudiant->precedent = 0;
}
if (etudiant->suivant==NULL) //cas du dernier élément
{
etudiant = etudiant->precedent;
etudiant->suivant = 0;
}
}
}
while (etudiant->precedent)
etudiant = etudiant->precedent;
}
}
return (etudiant);
}
void promo_finale(Etudiant *etudiant)
{
// suppression des étudiants dont la moyenne est < 12
while (etudiant->suivant)
{
if (etudiant->moy < 12)
supprimer(etudiant);
etudiant = etudiant->suivant;
}
while (etudiant->precedent) // on revient au début (pour l'appel de "afficher")
etudiant = etudiant->precedent;
}
void afficher(Etudiant *etudiant)
{
while (etudiant->suivant)
{
printf("Matricule étudiant : %s\n", etudiant->num);
printf("Nom étudiant : %f\n", etudiant->nom);
printf("Moyenne étudiant : %d\n", etudiant->moy);
printf("\n");
etudiant = etudiant->suivant;
}
}
void main()
{
Etudiant *etudiant = (Etudiant*)malloc(sizeof(Etudiant));
Etudiant *premier;
int i = 0;
int rep;
do
{
printf("\n\n");
printf(" ________________________________________________________________________|\n");
printf("| GEStIONAIRE ETUDIANT |\n");
printf("|________________________________________________________________________|\n");
printf("| 1 - ajouter un element a la fin de la liste |\n");
printf("| 2 - Affichage de la liste |\n");
printf("| 3 - Suppression |\n");
printf("| 4 - Obtenir la promotion finale |\n");
printf("| 0 - QUITTER |\n");
printf("|________________________________________________________________________|\n");
printf("| donner le numero de votre choix |\n");
printf("|________________________________________________________________________|\n\n");
scanf("%d",&rep);
switch(rep)
{
case 1: etudiant=ajout(etudiant);
i++;
if (i==1)
{
premier = etudiant->precedent;
premier->suivant=etudiant;
}
break;
case 2:if (premier==NULL)
printf("la liste est vide vous devez la remplir");
else
afficher(premier);
break;
case 3:
premier=supprimer(premier);
case 4:
promo_finale(premier);
}
}
while(rep!=0);
} |