Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <malloc.h>
- #include <string.h>
- #include "Chaine.h"
- //fatihaoutamante8@gmail.com
- //mrhamza.benmalek@gmail.com 0642089350
- //oussam.ste@gmail.com 0604287857
- //
- struct SEtudiant
- {
- unsigned int Code ;
- char * Nom ;
- char * Prenom ;
- unsigned int Age ;
- struct SEtudiant * svt;
- struct SEtudiant * pre ;
- };
- typedef struct SEtudiant Etudiant ;
- Etudiant * DL = NULL ;
- Etudiant * FL = NULL ;
- unsigned int CODE = 0 ;
- Etudiant * AllouerEtudiant()
- {
- Etudiant * e = (Etudiant *)malloc(1*sizeof(Etudiant));
- e->Code = ++CODE ;
- printf("\n Veuillez saisir le nom de l'etudiant : ") ;
- e->Nom = SaisirChaine() ;
- printf("\n Veuillez saisir le prenom de l'etudiant : ") ;
- e->Prenom = SaisirChaine() ;
- printf("\n Veuillez saisir l'age de l'etudiant : ") ;
- scanf("%u", &e->Age) ;
- getchar() ;
- return e ;
- }
- void AjouterEtudiant(char cible)
- {
- Etudiant * e ;
- if((cible != 'd') && (cible != 'f'))
- {
- printf("\n\t La position d'insertion est incorrecte : [d ou f]") ;
- return ;
- }
- e = AllouerEtudiant() ;
- if((DL == NULL) && (FL == NULL))
- {
- e->svt = NULL ;
- e->pre = NULL ;
- DL = e ;
- FL = e ;
- }
- else if(cible == 'd')
- {
- e->svt = DL ;
- e->pre = NULL ;
- DL->pre = e ;
- DL = e ;
- }
- else if(cible == 'f')
- {
- e->svt = NULL ;
- e->pre = FL ;
- FL->svt = e ;
- FL = e ;
- }
- }
- void AjouterListeEtudiants()
- {
- unsigned int i, nbe ;
- char cible ;
- printf("\n Saisir le nombre d'etudiants a ajouter : ") ;
- scanf("%u", &nbe) ;
- getchar() ;
- for(i = 0 ; i < nbe ; i++)
- {
- printf("\n Saisir la cible de l'etudiant a ajouter [d ou f] : ") ;
- scanf("%c", &cible) ;
- getchar() ;
- AjouterEtudiant(cible) ; // AjouterEtudiant('d') ou AjouterEtudiant('f')
- }
- }
- void AfficherEtudiant(Etudiant * e)
- {
- printf("\n Code \t: %u\n", e->Code) ;
- printf("\n Nom \t: %s\n", e->Nom) ;
- printf("\n Prenom : %s\n", e->Prenom) ;
- printf("\n Age \t: %u\n", e->Age) ;
- printf("\n\t-----------------\n") ;
- }
- void AfficherListeEtudiants()
- {
- Etudiant * Cur = DL ;
- while(Cur != NULL)
- {
- AfficherEtudiant(Cur) ;
- Cur = Cur->svt ;
- }
- }
- Etudiant * RechercherEtudiantSelonCode()
- {
- char *nom, *prenom;
- unsigned int i, code ;
- Etudiant * Cur = DL ;
- printf("\n\t Saisir le code de l'etudiant a rechercher : ") ;
- scanf("%u", &code) ;
- getchar() ;
- while(Cur != NULL)
- {
- if(Cur->Code == code)
- {
- free(nom) ;
- free(prenom) ;
- return Cur ;
- }
- Cur = Cur->svt ;
- }
- free(nom) ;
- free(prenom) ;
- return NULL ;
- }
- void AjouterEtudiantPosition(Etudiant * recherche , char * cible)
- {/*
- Pour plus de clarete, je n'ai pas optimise cette procedure
- Voila la liste des cas possibles :
- - 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.
- - 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
- - 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
- - 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*/
- Etudiant * e ;
- if((strcmp(cible, "av") != 0) && (strcmp(cible, "ap") != 0))
- {
- printf("\n\t La position d'insertion est incorrecte : [av ou ap]") ;
- return ;
- }
- if(recherche == NULL)
- {//Cas 0 : l'etudiant recherché n'existe pas, il n y aura pas d'ajout.
- printf("\n\t L'etudiant recherche n'existe pas") ;
- return ;
- }
- //on est maintenant dans le cas ou l'etudiant recherché existe.
- e = AllouerEtudiant() ;
- //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.
- if((recherche == DL) && (recherche == FL) && (strcmp(cible, "av") == 0))
- {//Cas 1
- //printf("\n insertion avant le debut de liste, DL == FL\n") ;
- e->svt = DL ;
- e->pre = NULL ;
- DL->pre = e ;
- DL = e ;
- }
- else if((recherche == DL) && (recherche == FL) && (strcmp(cible, "ap") == 0))
- {//Cas 2
- //printf("\n insertion apres le debut de liste, DL == FL\n") ;
- e->svt = NULL ;
- e->pre = FL ;
- FL->svt = e ;
- FL = e ;
- }
- //-------------------------//
- //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
- else if((recherche == DL) && (strcmp(cible, "av") == 0))
- {// Cas 3 : memes instructions que dans le Cas 1
- //printf("\n insertion avant debut de liste, DL != FL\n") ;
- e->svt = DL ;
- e->pre = NULL ;
- DL->pre = e ;
- DL = e ;
- }
- else if((recherche == DL) && (strcmp(cible, "ap") == 0))
- {//Cas 4
- //printf("\n insertion apres debut de liste, DL != FL\n") ;
- e->svt = DL->svt ;
- e->pre = DL ;
- DL->svt = e ;
- 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
- }
- //-------------------------//
- //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
- else if((recherche == FL) && (strcmp(cible, "av") == 0))
- {//Cas 5
- //printf("\n insertion avant fin de liste, DL != FL\n") ;
- e->svt = FL ;
- e->pre = FL->pre ;
- FL->pre = e ;
- 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
- }
- else if((recherche == FL) && (strcmp(cible, "ap") == 0))
- {//Cas 6 : memes instructions que dans le Cas 2
- //printf("\n insertion apres fin de liste, DL != FL\n") ;
- e->svt = NULL ;
- e->pre = FL ;
- FL->svt = e ;
- FL = e ;
- }
- //-------------------------//
- //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
- else if((recherche != DL) && (recherche != FL) && (strcmp(cible, "av") == 0))
- {//Cas 7
- //printf("\n insertion au milieu, avant l'element recherche, DL != FL\n") ;
- e->svt = recherche ; // recherche est non NULL
- e->pre = recherche->pre ; // recherche->pre est non NULL, puisque recherche n'est pas debut de liste
- e->svt->pre = e ; // e->svt est non NULL (puisque recherche est non NULL), on peut donc ecrire e->svt->pre = e
- 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
- }
- else if((recherche != DL) && (recherche != FL) && (strcmp(cible, "ap") == 0))
- {//Cas 8
- //printf("\n insertion au milieu, apres l'element recherche, DL != FL\n") ;
- e->pre = recherche ; // recherche est non NULL
- e->svt = recherche->svt ; // recherche->svt est non NULL, puisque recherche n'est pas fin de liste
- e->pre->svt = e ; // e->pre est non NULL (puisque recherche est non NULL), on peut donc ecrire e->pre->svt = e
- e->svt->pre = e ; // e->svt est non NULL (puisque recherche->svt est non NULL), on peut donc ecrire e->svt->pre = e
- }
- }
- void TrierListeEtudiantsParAge()
- {
- Etudiant * Curi , *Curj ;
- char *nom_aux, *prenom_aux ;
- unsigned int age_aux, code_aux ;
- for(Curi = DL ; Curi != FL ; Curi = Curi->svt)
- {
- for(Curj = Curi->svt ; Curj != NULL ; Curj = Curj->svt)
- {
- if(Curi->Age > Curj->Age)
- {
- //on permute les donnees (Code, Nom, Prenom et Age) sans toucher au chainage (Svt et Pre).
- code_aux = Curi->Code ;
- Curi->Code = Curj->Code ;
- Curj->Code = code_aux ;
- nom_aux = Curi->Nom ;
- Curi->Nom = Curj->Nom ;
- Curj->Nom = nom_aux ;
- prenom_aux = Curi->Prenom ;
- Curi->Prenom = Curj->Prenom ;
- Curj->Prenom = prenom_aux ;
- age_aux = Curi->Age ;
- Curi->Age = Curj->Age ;
- Curj->Age = age_aux ;
- }
- }
- }
- }
- void TrierListeEtudiantsParNomPrenom()
- {
- Etudiant * Curi , *Curj ;
- char *nom_aux, *prenom_aux ;
- unsigned int age_aux, code_aux ;
- for(Curi = DL ; Curi != FL ; Curi = Curi->svt)
- {
- for(Curj = Curi->svt ; Curj != NULL ; Curj = Curj->svt)
- {
- if((strcmp(Curi->Nom, Curj->Nom) > 0) || ((strcmp(Curi->Nom, Curj->Nom) == 0) && (strcmp(Curi->Prenom, Curj->Prenom) > 0)))
- {
- //on permute les donnees (Code, Nom, Prenom et Age) sans toucher au chainage (Svt et Pre).
- code_aux = Curi->Code ;
- Curi->Code = Curj->Code ;
- Curj->Code = code_aux ;
- nom_aux = Curi->Nom ;
- Curi->Nom = Curj->Nom ;
- Curj->Nom = nom_aux ;
- prenom_aux = Curi->Prenom ;
- Curi->Prenom = Curj->Prenom ;
- Curj->Prenom = prenom_aux ;
- age_aux = Curi->Age ;
- Curi->Age = Curj->Age ;
- Curj->Age = age_aux ;
- }
- }
- }
- }
- void SupprimerEtudiant(Etudiant * e)
- {//Pour plus de clarete, je n'ai pas optimise cette procedure
- if((DL == NULL) && (FL == NULL))
- {//Cas 0.1 : la liste des etudiants est vide
- printf("\n la liste des etudiants est vide.") ;
- }
- else if(e == NULL)
- {//Cas 0.2 : l'etudiant a supprimer n'existe pas dans la liste
- printf("\n l'etudiant a supprimer n'existe pas dans la liste.") ;
- }
- else if((e == DL) && (e == FL))
- {//Cas 1 : l'etudiant a supprimer est a la fois debut et fin de liste
- DL = NULL ;
- FL = NULL ;
- free(e->Nom) ;
- free(e->Prenom) ;
- free(e) ;
- }
- else if((e == DL) && (e != FL))
- {//Cas 2 : l'etudiant a supprimer se trouve en debut de liste, et DL != FL
- DL = DL->svt ;
- free(e->Nom) ;
- free(e->Prenom) ;
- free(e) ;
- }
- else if((e == FL) && (e != DL))
- {//Cas 3 : l'etudiant a supprimer se trouve en fin de liste, et DL != FL
- FL = FL->pre ;
- free(e->Nom) ;
- free(e->Prenom) ;
- free(e) ;
- }
- else if((e != DL) && (e != FL))
- {//Cas 4 : l'etudiant a supprimer ne se trouve ni en debut de liste, ni en fin de liste
- e->pre->svt = e->svt ;
- e->svt->pre = e->pre ;
- free(e->Nom) ;
- free(e->Prenom) ;
- free(e) ;
- }
- }
- void MenuEtudiant()
- {
- int i, nbe = 2 ;
- char cible[3] ;
- AjouterListeEtudiants() ;
- AfficherListeEtudiants() ;
- for(i = 0 ; i < nbe ; i++)
- {
- printf("\n Saisir la cible de l'etudiant a ajouter [av ou ap] : ") ;
- scanf("%s", cible) ;
- getchar() ;
- printf("\n===> AJOUT D'UN ETUDIANT : \n") ;
- AjouterEtudiantPosition(RechercherEtudiantSelonCode(), cible) ;
- AfficherListeEtudiants() ;
- }
- TrierListeEtudiantsParAge() ;
- printf("\n\t Resultat du tri par age : \n") ;
- AfficherListeEtudiants() ;
- TrierListeEtudiantsParNomPrenom() ;
- printf("\n\t Resultat du tri par nom et prenom : \n") ;
- AfficherListeEtudiants() ;
- printf("\n===> SUPPRESSION D'UN ETUDIANT : \n") ;
- SupprimerEtudiant(RechercherEtudiantSelonCode()) ;
- printf("\n\t Resultat apres suppression : \n") ;
- AfficherListeEtudiants() ;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement