Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #define MAX_SIZE 25
- #define GAUCHE 0
- #define DROITE 1
- //typedef struct fam fam;
- typedef struct ABR // je regroupe les types ensembles pour une bonne presentation
- {
- int jour;
- int mois;
- int annee;
- int num;
- char prenom[MAX_SIZE]; //change numerO 1
- char sexe;
- struct ABR *freregauche;
- struct ABR *filsdroit;
- }ABR;
- ABR *cree(int jourr, int moiss, int anneee, char prenomm[20], int n, char sexee)
- {
- struct ABR *tmp = (ABR *)malloc(sizeof(ABR));
- //attention toujours tester le retour du malloc, c'est important
- //car il peut echouer
- if(NULL == tmp){
- fprintf(stderr, "Echec Allocation\n");
- return NULL;
- }
- tmp->jour = jourr;
- tmp->mois = moiss;
- tmp->annee = anneee;
- strcpy(tmp->prenom, prenomm);
- tmp->num = n;
- tmp->freregauche = NULL;
- tmp->filsdroit = NULL;
- tmp->sexe = sexee;
- return tmp;
- }
- ABR *recherche(ABR *pp, int n) // je te conseil double pointer , pour eviter les copise de pointer car on a besoin de leur adresse reelle
- {
- if(pp == NULL || pp->num == n) // car tu dereferencie apres sans verifier sil est null, ca peut faire cracher ton code
- return pp;
- if(n < pp->num)
- return recherche( pp->freregauche, n);
- else
- return recherche( pp->filsdroit, n);
- }
- ABR *inserer_nouveau_membre(ABR *arbre, ABR *nouveau_membre, int ou) //gauche = 0, droite = 1
- {
- if (arbre == NULL || nouveau_membre == NULL)
- return nouveau_membre;
- if(ou == GAUCHE){
- arbre->freregauche = inserer_nouveau_membre(arbre->freregauche, nouveau_membre, ou);
- }
- else if (ou == DROITE)
- {
- arbre->filsdroit = inserer_nouveau_membre(arbre->filsdroit, nouveau_membre, ou);
- }
- return arbre;
- }
- ABR *ajoutint(ABR *pp, int jourr, int moiss, int anneee, char prenomm[20], int n, char sexee)
- {
- char prenompr[50];
- ABR *pp1, *T;
- int x;//un conseil: prend des noms explicatifs pour un projet reel c'est important, x c'est vague
- if (pp == NULL)
- {
- //ABR *T = NULL; // ligne pas trop utile
- pp = cree(jourr, moiss, anneee, prenomm, n, sexee);
- return (pp);
- }
- else
- {
- printf("ce dernier a t il de frere (tapez 1) ou un pere (tapez 2)?");
- scanf("%d", &x);
- //j'ajoute
- if(x == 2){ //donc a un pere
- printf("donnez le num du pere de ce dernier");
- scanf("%d", &n);
- T = cree(jourr, moiss, anneee, prenomm, n, sexee);
- inserer_nouveau_membre(pp, T, DROITE);
- }
- }
- if (x == 1)
- {
- printf("donnez le num du frere ");
- scanf("%d", &n);
- T = cree(jourr, moiss, anneee, prenomm, n, sexee);
- inserer_nouveau_membre(pp, T, GAUCHE);
- }
- return pp;
- }
- ABR *plusPetiteValeur(ABR *membre)
- {
- ABR *membre_courante = membre;
- /* loop down to find the leftmost leaf */
- while (membre_courante && membre_courante->freregauche != NULL)
- membre_courante = membre_courante->freregauche;
- return membre_courante;
- }
- ABR *supprime(ABR *pp, int n)
- {
- if(NULL == pp)
- return pp ;
- if(pp->num > n )
- pp->filsdroit = supprime(pp->filsdroit, n);
- else if (pp->num < n)
- pp->freregauche = supprime(pp->freregauche, n);
- else {
- // s'il ya qu'un seul frere ou pas du tout
- if (pp->freregauche == NULL)
- {
- ABR *membre_droit = pp->filsdroit;
- free(pp);
- pp = NULL;//toujours mettre a null apres liberation de memoire
- return membre_droit;//on retourn fils droit
- }
- else if (pp->filsdroit == NULL)
- {
- ABR *membre_gauche = pp->freregauche;
- free(pp);
- pp = NULL; //pour eviter au pointer d'etre egaré// reseigne toi sur dangling pointer
- return membre_gauche;
- }
- //maintenant pour les membre ayant tous les deux cotes au complet
- ABR *temp = plusPetiteValeur(pp->filsdroit);
- pp->num = temp->num;
- pp->filsdroit = supprime(pp->filsdroit, temp->num);
- }
- return pp;
- }
- void affichage(struct ABR *pp, int x)
- {
- struct ABR *ppp = pp;
- if (ppp != NULL)
- {
- affichage(ppp->filsdroit, x + 5);
- printf("\n %d | %d | %d | %d", x, ppp->jour, ppp->mois, ppp->annee);
- printf("\n %*s %d %c", x, ppp->prenom, ppp->num, ppp->sexe);
- affichage(ppp->freregauche, x + 5);
- }
- }
- int main()
- {
- ABR *pp, *pp1, *pp2, *pp3;
- int n, a, i, b, x;
- char prenom[20];
- int jj, aa, mm;
- char sexe;
- printf("donnez le prenom du premier parent");
- fflush(stdin);
- scanf("%s", prenom);
- printf("donnez la date de naissance complete du premier parent");
- fflush(stdin);
- scanf("%d/%d/%d", &jj, &mm, &aa);
- printf("donnez le sexe du premier parent");
- fflush(stdin);
- scanf("%c", &sexe);
- printf("donnez le num du premier parent");
- fflush(stdin);
- scanf("%d", &a);
- pp = cree(jj, mm, aa, prenom, a, sexe);
- printf("donnez le nombre de la famille");
- fflush(stdin);
- scanf("%d", &n);
- for (i = 0; i < n; i++)
- {
- printf("donnez le prenom du nouveau arrive");
- fflush(stdin);
- scanf("%s", prenom);
- printf("donnez la date de naissance complete du nouveau arrive");
- fflush(stdin);
- scanf("%d/%d/%d", &jj, &mm, &aa);
- printf("donnez le sexe du nouveau arrive");
- fflush(stdin);
- scanf("%c", &sexe);
- printf("donnez le num du nouveau arrive");
- fflush(stdin);
- scanf("%d", &a);
- pp = ajoutint(pp, jj, mm, aa, prenom, a, sexe);
- }
- printf("si vous voulez supprimer un membre tapez 1 sinon 0");
- scanf("%d", &b);
- if (b == 1){
- int x;
- printf("Entrer son numero: \nn");
- scanf("%d", &x);
- pp = supprime(pp, x);
- }
- affichage(pp, 5);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement