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 : Sélectionner tout - Visualiser dans une fenêtre à part
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); }
Partager