Advertisement
tresonance

essai_ce _code

May 30th, 2020
1,333
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.99 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4.  
  5. #define MAX_SIZE 25
  6.  
  7. #define GAUCHE 0
  8. #define DROITE 1
  9.  
  10. //typedef struct fam fam;
  11. typedef struct ABR // je regroupe les types ensembles pour une bonne presentation
  12. {
  13.     int jour;
  14.     int mois;
  15.     int annee;
  16.     int num;
  17.  
  18.     char prenom[MAX_SIZE]; //change numerO 1
  19.     char sexe;
  20.  
  21.     struct ABR *freregauche;
  22.     struct ABR *filsdroit;
  23. }ABR;
  24.  
  25. ABR *cree(int jourr, int moiss, int anneee, char prenomm[20], int n, char sexee)
  26. {
  27.     struct ABR *tmp = (ABR *)malloc(sizeof(ABR));
  28.     //attention toujours tester le retour du malloc, c'est important
  29.     //car il peut echouer
  30.     if(NULL == tmp){
  31.         fprintf(stderr, "Echec Allocation\n");
  32.         return NULL;
  33.     }
  34.     tmp->jour = jourr;
  35.     tmp->mois = moiss;
  36.     tmp->annee = anneee;
  37.     strcpy(tmp->prenom, prenomm);
  38.     tmp->num = n;
  39.     tmp->freregauche = NULL;
  40.     tmp->filsdroit = NULL;
  41.     tmp->sexe = sexee;
  42.     return tmp;
  43. }
  44. 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
  45. {
  46.     if(pp == NULL || pp->num == n) // car tu dereferencie apres sans verifier sil est null, ca peut faire cracher ton code
  47.         return pp;
  48.     if(n < pp->num)
  49.         return recherche( pp->freregauche, n);
  50.     else
  51.         return recherche( pp->filsdroit, n);
  52. }
  53.  
  54. ABR *inserer_nouveau_membre(ABR *arbre, ABR *nouveau_membre, int ou) //gauche = 0, droite = 1
  55. {
  56.     if (arbre == NULL || nouveau_membre == NULL)
  57.         return nouveau_membre;
  58.     if(ou == GAUCHE){
  59.         arbre->freregauche = inserer_nouveau_membre(arbre->freregauche, nouveau_membre, ou);
  60.     }
  61.     else if (ou == DROITE)
  62.     {
  63.         arbre->filsdroit = inserer_nouveau_membre(arbre->filsdroit, nouveau_membre, ou);
  64.     }
  65.     return arbre;
  66. }
  67.  
  68. ABR *ajoutint(ABR *pp, int jourr, int moiss, int anneee, char prenomm[20], int n, char sexee)
  69. {
  70.     char prenompr[50];
  71.     ABR *pp1, *T;
  72.     int x;//un conseil: prend des noms explicatifs pour un projet reel c'est important, x c'est vague
  73.     if (pp == NULL)
  74.     {
  75.  
  76.         //ABR *T = NULL; // ligne pas trop utile
  77.         pp = cree(jourr, moiss, anneee, prenomm, n, sexee);
  78.         return (pp);
  79.     }
  80.     else
  81.     {
  82.         printf("ce dernier a t il de frere (tapez 1) ou un pere (tapez 2)?");
  83.         scanf("%d", &x);
  84.         //j'ajoute
  85.         if(x == 2){ //donc a un pere
  86.             printf("donnez le num du pere de ce dernier");
  87.             scanf("%d", &n);
  88.             T = cree(jourr, moiss, anneee, prenomm, n, sexee);
  89.             inserer_nouveau_membre(pp, T, DROITE);
  90.         }
  91.     }
  92.     if (x == 1)
  93.     {
  94.         printf("donnez le num du frere ");
  95.         scanf("%d", &n);
  96.         T = cree(jourr, moiss, anneee, prenomm, n, sexee);
  97.         inserer_nouveau_membre(pp, T, GAUCHE);
  98.     }
  99.     return pp;
  100. }
  101.  
  102. ABR *plusPetiteValeur(ABR *membre)
  103. {
  104.     ABR *membre_courante = membre;
  105.  
  106.     /* loop down to find the leftmost leaf */
  107.     while (membre_courante && membre_courante->freregauche != NULL)
  108.         membre_courante = membre_courante->freregauche;
  109.  
  110.     return membre_courante;
  111. }
  112.  
  113. ABR *supprime(ABR *pp, int n)
  114. {
  115.    if(NULL == pp)
  116.         return pp ;
  117.     if(pp->num > n )
  118.         pp->filsdroit =  supprime(pp->filsdroit, n);
  119.     else if (pp->num < n)
  120.         pp->freregauche = supprime(pp->freregauche, n);
  121.     else {
  122.         // s'il ya qu'un seul frere ou pas du tout
  123.         if (pp->freregauche == NULL)
  124.         {
  125.             ABR *membre_droit = pp->filsdroit;
  126.             free(pp);
  127.             pp = NULL;//toujours mettre a null apres liberation de memoire
  128.             return membre_droit;//on retourn fils droit
  129.         }
  130.         else if (pp->filsdroit == NULL)
  131.         {
  132.             ABR  *membre_gauche = pp->freregauche;
  133.             free(pp);
  134.             pp = NULL; //pour eviter au pointer d'etre egaré// reseigne toi sur dangling pointer
  135.             return membre_gauche;
  136.         }
  137.         //maintenant pour les membre ayant tous les deux cotes au complet
  138.         ABR *temp = plusPetiteValeur(pp->filsdroit);
  139.         pp->num = temp->num;
  140.         pp->filsdroit = supprime(pp->filsdroit, temp->num);
  141.     }
  142.     return pp;
  143. }
  144.  
  145.  
  146. void affichage(struct ABR *pp, int x)
  147. {
  148.     struct ABR *ppp = pp;
  149.     if (ppp != NULL)
  150.     {
  151.  
  152.         affichage(ppp->filsdroit, x + 5);
  153.         printf("\n %d | %d | %d | %d", x, ppp->jour, ppp->mois, ppp->annee);
  154.         printf("\n %*s %d %c", x, ppp->prenom, ppp->num, ppp->sexe);
  155.         affichage(ppp->freregauche, x + 5);
  156.     }
  157. }
  158. int main()
  159. {
  160.     ABR *pp, *pp1, *pp2, *pp3;
  161.     int n, a, i, b, x;
  162.     char prenom[20];
  163.     int jj, aa, mm;
  164.     char sexe;
  165.  
  166.     printf("donnez le prenom du premier parent");
  167.     fflush(stdin);
  168.     scanf("%s", prenom);
  169.     printf("donnez la date de naissance complete du premier parent");
  170.     fflush(stdin);
  171.     scanf("%d/%d/%d", &jj, &mm, &aa);
  172.     printf("donnez le sexe du premier parent");
  173.     fflush(stdin);
  174.     scanf("%c", &sexe);
  175.     printf("donnez le num du premier parent");
  176.     fflush(stdin);
  177.     scanf("%d", &a);
  178.  
  179.     pp = cree(jj, mm, aa, prenom, a, sexe);
  180.     printf("donnez le nombre de la famille");
  181.     fflush(stdin);
  182.     scanf("%d", &n);
  183.     for (i = 0; i < n; i++)
  184.     {
  185.  
  186.         printf("donnez le prenom du nouveau arrive");
  187.         fflush(stdin);
  188.         scanf("%s", prenom);
  189.  
  190.         printf("donnez la date de naissance complete du nouveau arrive");
  191.         fflush(stdin);
  192.         scanf("%d/%d/%d", &jj, &mm, &aa);
  193.         printf("donnez le sexe du nouveau arrive");
  194.         fflush(stdin);
  195.         scanf("%c", &sexe);
  196.         printf("donnez le num du nouveau arrive");
  197.         fflush(stdin);
  198.         scanf("%d", &a);
  199.         pp = ajoutint(pp, jj, mm, aa, prenom, a, sexe);
  200.     }
  201.     printf("si vous voulez supprimer un membre tapez 1 sinon 0");
  202.     scanf("%d", &b);
  203.     if (b == 1){
  204.         int x;
  205.         printf("Entrer son numero: \nn");
  206.         scanf("%d", &x);
  207.         pp = supprime(pp, x);
  208.     }
  209.  
  210.     affichage(pp, 5);
  211. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement