Advertisement
Guest User

Untitled

a guest
Jan 2nd, 2019
341
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 12.34 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <malloc.h>
  3. #include <string.h>
  4. #include "Chaine.h"
  5. //fatihaoutamante8@gmail.com
  6. //mrhamza.benmalek@gmail.com 0642089350
  7. //oussam.ste@gmail.com 0604287857
  8. //
  9. struct SEtudiant
  10. {
  11. unsigned int Code ;
  12. char * Nom ;
  13. char * Prenom ;
  14. unsigned int Age ;
  15. struct SEtudiant * svt;
  16. struct SEtudiant * pre ;
  17. };
  18. typedef struct SEtudiant Etudiant ;
  19.  
  20. Etudiant * DL = NULL ;
  21. Etudiant * FL = NULL ;
  22. unsigned int CODE = 0 ;
  23.  
  24. Etudiant * AllouerEtudiant()
  25. {
  26. Etudiant * e = (Etudiant *)malloc(1*sizeof(Etudiant));
  27. e->Code = ++CODE ;
  28. printf("\n Veuillez saisir le nom de l'etudiant : ") ;
  29. e->Nom = SaisirChaine() ;
  30. printf("\n Veuillez saisir le prenom de l'etudiant : ") ;
  31. e->Prenom = SaisirChaine() ;
  32. printf("\n Veuillez saisir l'age de l'etudiant : ") ;
  33. scanf("%u", &e->Age) ;
  34. getchar() ;
  35. return e ;
  36. }
  37.  
  38. void AjouterEtudiant(char cible)
  39. {
  40. Etudiant * e ;
  41.  
  42. if((cible != 'd') && (cible != 'f'))
  43. {
  44. printf("\n\t La position d'insertion est incorrecte : [d ou f]") ;
  45. return ;
  46. }
  47.  
  48. e = AllouerEtudiant() ;
  49.  
  50. if((DL == NULL) && (FL == NULL))
  51. {
  52. e->svt = NULL ;
  53. e->pre = NULL ;
  54. DL = e ;
  55. FL = e ;
  56. }
  57. else if(cible == 'd')
  58. {
  59. e->svt = DL ;
  60. e->pre = NULL ;
  61. DL->pre = e ;
  62. DL = e ;
  63. }
  64. else if(cible == 'f')
  65. {
  66. e->svt = NULL ;
  67. e->pre = FL ;
  68. FL->svt = e ;
  69. FL = e ;
  70. }
  71. }
  72.  
  73. void AjouterListeEtudiants()
  74. {
  75. unsigned int i, nbe ;
  76. char cible ;
  77. printf("\n Saisir le nombre d'etudiants a ajouter : ") ;
  78. scanf("%u", &nbe) ;
  79. getchar() ;
  80. for(i = 0 ; i < nbe ; i++)
  81. {
  82. printf("\n Saisir la cible de l'etudiant a ajouter [d ou f] : ") ;
  83. scanf("%c", &cible) ;
  84. getchar() ;
  85. AjouterEtudiant(cible) ; // AjouterEtudiant('d') ou AjouterEtudiant('f')
  86. }
  87. }
  88.  
  89. void AfficherEtudiant(Etudiant * e)
  90. {
  91. printf("\n Code \t: %u\n", e->Code) ;
  92. printf("\n Nom \t: %s\n", e->Nom) ;
  93. printf("\n Prenom : %s\n", e->Prenom) ;
  94. printf("\n Age \t: %u\n", e->Age) ;
  95. printf("\n\t-----------------\n") ;
  96. }
  97.  
  98. void AfficherListeEtudiants()
  99. {
  100. Etudiant * Cur = DL ;
  101.  
  102. while(Cur != NULL)
  103. {
  104. AfficherEtudiant(Cur) ;
  105. Cur = Cur->svt ;
  106. }
  107. }
  108.  
  109. Etudiant * RechercherEtudiantSelonCode()
  110. {
  111. char *nom, *prenom;
  112. unsigned int i, code ;
  113. Etudiant * Cur = DL ;
  114.  
  115. printf("\n\t Saisir le code de l'etudiant a rechercher : ") ;
  116. scanf("%u", &code) ;
  117. getchar() ;
  118.  
  119. while(Cur != NULL)
  120. {
  121. if(Cur->Code == code)
  122. {
  123. free(nom) ;
  124. free(prenom) ;
  125. return Cur ;
  126. }
  127. Cur = Cur->svt ;
  128. }
  129. free(nom) ;
  130. free(prenom) ;
  131. return NULL ;
  132. }
  133.  
  134. void AjouterEtudiantPosition(Etudiant * recherche , char * cible)
  135. {/*
  136. Pour plus de clarete, je n'ai pas optimise cette procedure
  137. Voila la liste des cas possibles :
  138. - Cas 1 et 2 : l'etudiant recherché se trouve a la fois en debut et en fin de liste, cela signifie qu'il est seul dans la liste.
  139. - Cas 3 et 4 : l'etudiant recherché se trouve en debut de liste, en plus DL != FL, cela sigifie entre autre que DL->svt est non NULL
  140. - Cas 5 et 6 : l'etudiant recherché se trouve en fin de liste, en plus DL != FL, cela signifie entre autre que FL->pre est non NULL
  141. - Cas 7 et 8 : l'etudiant recherché ne se trouve ni en debut, ni en fin de liste, cela sigifie que recherche->svt est non NULL, et que recherche->pre est non NULL*/
  142.  
  143. Etudiant * e ;
  144.  
  145. if((strcmp(cible, "av") != 0) && (strcmp(cible, "ap") != 0))
  146. {
  147. printf("\n\t La position d'insertion est incorrecte : [av ou ap]") ;
  148. return ;
  149. }
  150.  
  151. if(recherche == NULL)
  152. {//Cas 0 : l'etudiant recherché n'existe pas, il n y aura pas d'ajout.
  153. printf("\n\t L'etudiant recherche n'existe pas") ;
  154. return ;
  155. }
  156.  
  157. //on est maintenant dans le cas ou l'etudiant recherché existe.
  158.  
  159. e = AllouerEtudiant() ;
  160.  
  161. //Cas 1 et 2 : l'etudiant recherché se trouveà la fois en debut et en fin de liste, cela signifie qu'il est seul dans la liste.
  162. if((recherche == DL) && (recherche == FL) && (strcmp(cible, "av") == 0))
  163. {//Cas 1
  164. //printf("\n insertion avant le debut de liste, DL == FL\n") ;
  165. e->svt = DL ;
  166. e->pre = NULL ;
  167. DL->pre = e ;
  168. DL = e ;
  169. }
  170. else if((recherche == DL) && (recherche == FL) && (strcmp(cible, "ap") == 0))
  171. {//Cas 2
  172. //printf("\n insertion apres le debut de liste, DL == FL\n") ;
  173. e->svt = NULL ;
  174. e->pre = FL ;
  175. FL->svt = e ;
  176. FL = e ;
  177. }
  178. //-------------------------//
  179. //Cas 3 et 4 : l'etudiant recherché se trouve en début de liste, en plus DL != FL, cela sigifie entre autre que DL->svt est non NULL
  180. else if((recherche == DL) && (strcmp(cible, "av") == 0))
  181. {// Cas 3 : memes instructions que dans le Cas 1
  182. //printf("\n insertion avant debut de liste, DL != FL\n") ;
  183. e->svt = DL ;
  184. e->pre = NULL ;
  185. DL->pre = e ;
  186. DL = e ;
  187. }
  188. else if((recherche == DL) && (strcmp(cible, "ap") == 0))
  189. {//Cas 4
  190. //printf("\n insertion apres debut de liste, DL != FL\n") ;
  191. e->svt = DL->svt ;
  192. e->pre = DL ;
  193. DL->svt = e ;
  194. e->svt->pre = e ; //l'etudiant recherché ne se trouve pas en fin de liste (FL), ce qui fait que e->svt != NULL, par consequent on peut ecrire e->svt->pre = e
  195. }
  196. //-------------------------//
  197. //Cas 5 et 6 : l'etudiant recherché se trouve en fin de liste, en plus DL != FL, cela signifie entre autre que FL->pre est non NULL
  198. else if((recherche == FL) && (strcmp(cible, "av") == 0))
  199. {//Cas 5
  200. //printf("\n insertion avant fin de liste, DL != FL\n") ;
  201. e->svt = FL ;
  202. e->pre = FL->pre ;
  203. FL->pre = e ;
  204. e->pre->svt = e ; //l'etudiant recherché ne se trouve pas en debut de liste (DL), ce qui fait que e->pre != NULL, par consequent on peut ecrire e->pre->svt = e
  205. }
  206. else if((recherche == FL) && (strcmp(cible, "ap") == 0))
  207. {//Cas 6 : memes instructions que dans le Cas 2
  208. //printf("\n insertion apres fin de liste, DL != FL\n") ;
  209. e->svt = NULL ;
  210. e->pre = FL ;
  211. FL->svt = e ;
  212. FL = e ;
  213. }
  214. //-------------------------//
  215. //Cas 7 et 8 : l'etudiant recherché ne se trouve ni en debut, ni en fin de liste, cela sigifie que recherche->svt est non NULL, et que recherche->pre est non NULL
  216. else if((recherche != DL) && (recherche != FL) && (strcmp(cible, "av") == 0))
  217. {//Cas 7
  218. //printf("\n insertion au milieu, avant l'element recherche, DL != FL\n") ;
  219. e->svt = recherche ; // recherche est non NULL
  220. e->pre = recherche->pre ; // recherche->pre est non NULL, puisque recherche n'est pas debut de liste
  221. e->svt->pre = e ; // e->svt est non NULL (puisque recherche est non NULL), on peut donc ecrire e->svt->pre = e
  222. e->pre->svt = e ; // e->pre est non NULL (recherche->pre est non NULL, puisque recherche n'est pas le debut de liste), on peut donc ecrire e->pre->svt = e
  223. }
  224. else if((recherche != DL) && (recherche != FL) && (strcmp(cible, "ap") == 0))
  225. {//Cas 8
  226. //printf("\n insertion au milieu, apres l'element recherche, DL != FL\n") ;
  227. e->pre = recherche ; // recherche est non NULL
  228. e->svt = recherche->svt ; // recherche->svt est non NULL, puisque recherche n'est pas fin de liste
  229. e->pre->svt = e ; // e->pre est non NULL (puisque recherche est non NULL), on peut donc ecrire e->pre->svt = e
  230. e->svt->pre = e ; // e->svt est non NULL (puisque recherche->svt est non NULL), on peut donc ecrire e->svt->pre = e
  231. }
  232. }
  233.  
  234. void TrierListeEtudiantsParAge()
  235. {
  236. Etudiant * Curi , *Curj ;
  237. char *nom_aux, *prenom_aux ;
  238. unsigned int age_aux, code_aux ;
  239.  
  240. for(Curi = DL ; Curi != FL ; Curi = Curi->svt)
  241. {
  242. for(Curj = Curi->svt ; Curj != NULL ; Curj = Curj->svt)
  243. {
  244. if(Curi->Age > Curj->Age)
  245. {
  246. //on permute les donnees (Code, Nom, Prenom et Age) sans toucher au chainage (Svt et Pre).
  247. code_aux = Curi->Code ;
  248. Curi->Code = Curj->Code ;
  249. Curj->Code = code_aux ;
  250.  
  251. nom_aux = Curi->Nom ;
  252. Curi->Nom = Curj->Nom ;
  253. Curj->Nom = nom_aux ;
  254.  
  255. prenom_aux = Curi->Prenom ;
  256. Curi->Prenom = Curj->Prenom ;
  257. Curj->Prenom = prenom_aux ;
  258.  
  259. age_aux = Curi->Age ;
  260. Curi->Age = Curj->Age ;
  261. Curj->Age = age_aux ;
  262. }
  263. }
  264. }
  265. }
  266.  
  267. void TrierListeEtudiantsParNomPrenom()
  268. {
  269. Etudiant * Curi , *Curj ;
  270. char *nom_aux, *prenom_aux ;
  271. unsigned int age_aux, code_aux ;
  272.  
  273. for(Curi = DL ; Curi != FL ; Curi = Curi->svt)
  274. {
  275. for(Curj = Curi->svt ; Curj != NULL ; Curj = Curj->svt)
  276. {
  277. if((strcmp(Curi->Nom, Curj->Nom) > 0) || ((strcmp(Curi->Nom, Curj->Nom) == 0) && (strcmp(Curi->Prenom, Curj->Prenom) > 0)))
  278. {
  279. //on permute les donnees (Code, Nom, Prenom et Age) sans toucher au chainage (Svt et Pre).
  280.  
  281. code_aux = Curi->Code ;
  282. Curi->Code = Curj->Code ;
  283. Curj->Code = code_aux ;
  284.  
  285. nom_aux = Curi->Nom ;
  286. Curi->Nom = Curj->Nom ;
  287. Curj->Nom = nom_aux ;
  288.  
  289. prenom_aux = Curi->Prenom ;
  290. Curi->Prenom = Curj->Prenom ;
  291. Curj->Prenom = prenom_aux ;
  292.  
  293. age_aux = Curi->Age ;
  294. Curi->Age = Curj->Age ;
  295. Curj->Age = age_aux ;
  296. }
  297. }
  298. }
  299. }
  300.  
  301. void SupprimerEtudiant(Etudiant * e)
  302. {//Pour plus de clarete, je n'ai pas optimise cette procedure
  303.  
  304. if((DL == NULL) && (FL == NULL))
  305. {//Cas 0.1 : la liste des etudiants est vide
  306. printf("\n la liste des etudiants est vide.") ;
  307. }
  308. else if(e == NULL)
  309. {//Cas 0.2 : l'etudiant a supprimer n'existe pas dans la liste
  310. printf("\n l'etudiant a supprimer n'existe pas dans la liste.") ;
  311. }
  312. else if((e == DL) && (e == FL))
  313. {//Cas 1 : l'etudiant a supprimer est a la fois debut et fin de liste
  314. DL = NULL ;
  315. FL = NULL ;
  316. free(e->Nom) ;
  317. free(e->Prenom) ;
  318. free(e) ;
  319. }
  320. else if((e == DL) && (e != FL))
  321. {//Cas 2 : l'etudiant a supprimer se trouve en debut de liste, et DL != FL
  322. DL = DL->svt ;
  323. free(e->Nom) ;
  324. free(e->Prenom) ;
  325. free(e) ;
  326. }
  327. else if((e == FL) && (e != DL))
  328. {//Cas 3 : l'etudiant a supprimer se trouve en fin de liste, et DL != FL
  329. FL = FL->pre ;
  330. free(e->Nom) ;
  331. free(e->Prenom) ;
  332. free(e) ;
  333. }
  334. else if((e != DL) && (e != FL))
  335. {//Cas 4 : l'etudiant a supprimer ne se trouve ni en debut de liste, ni en fin de liste
  336. e->pre->svt = e->svt ;
  337. e->svt->pre = e->pre ;
  338. free(e->Nom) ;
  339. free(e->Prenom) ;
  340. free(e) ;
  341. }
  342. }
  343.  
  344. void MenuEtudiant()
  345. {
  346. int i, nbe = 2 ;
  347. char cible[3] ;
  348. AjouterListeEtudiants() ;
  349. AfficherListeEtudiants() ;
  350.  
  351. for(i = 0 ; i < nbe ; i++)
  352. {
  353. printf("\n Saisir la cible de l'etudiant a ajouter [av ou ap] : ") ;
  354. scanf("%s", cible) ;
  355. getchar() ;
  356. printf("\n===> AJOUT D'UN ETUDIANT : \n") ;
  357. AjouterEtudiantPosition(RechercherEtudiantSelonCode(), cible) ;
  358. AfficherListeEtudiants() ;
  359. }
  360. TrierListeEtudiantsParAge() ;
  361. printf("\n\t Resultat du tri par age : \n") ;
  362. AfficherListeEtudiants() ;
  363. TrierListeEtudiantsParNomPrenom() ;
  364. printf("\n\t Resultat du tri par nom et prenom : \n") ;
  365. AfficherListeEtudiants() ;
  366. printf("\n===> SUPPRESSION D'UN ETUDIANT : \n") ;
  367. SupprimerEtudiant(RechercherEtudiantSelonCode()) ;
  368. printf("\n\t Resultat apres suppression : \n") ;
  369. AfficherListeEtudiants() ;
  370. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement