Guest User

Untitled

a guest
Jun 19th, 2018
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.06 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <assert.h>
  5. #include "include.h"
  6. #define NB_CASES_TABLEAU 50
  7.  
  8. int main(void)
  9. {
  10.     //===============
  11.     // = Question 1 =
  12.     //===============
  13.     t_pile* debut_pile;
  14.  
  15.     debut_pile=(t_pile*)malloc(sizeof(t_pile));
  16.  
  17.     assert(debut_pile!=NULL);
  18.  
  19.     debut_pile->pt_suiv=NULL;
  20.     debut_pile->pt_noeud=NULL;
  21.  
  22.     // Création de l'arbre
  23.  
  24.     t_noeud *arbre;
  25.     arbre = NULL;
  26.  
  27.     char operation[NB_CASES_TABLEAU];
  28.  
  29.     // déclaration des variables utiles lors de la lecture en entrée
  30.  
  31.     printf("Ecrivez votre expression : ");
  32.  
  33.     //traitement chaine de caractere
  34.     printf("before");
  35.     scanf("%s", operation); // On écrit dans le tableau operation, de 50 cases avec l'entrée classique (clavier)
  36.     printf("After");
  37.     // Remplissage de l'arbre
  38.  
  39.     //creer_arbre(&arbre,debut_pile,operation);
  40.     printf("Arbre créé");
  41.  
  42.     // Affichage post fixé
  43.  
  44.     imprime_postfixe(arbre);
  45.     printf("\n");
  46.  
  47.     // affichage infixé
  48.  
  49.     imprime_infixe(arbre);
  50.     printf("\n");
  51.  
  52.     return 0;
  53. }
  54. //=============================================================
  55.  
  56. // =============
  57. // = FONCTIONS =
  58. // =============
  59.  
  60. // ==================================================================
  61. // Fonction empiler : Permet d'empiler un caractère
  62. //
  63. // Entrée : Prend en paramètre le début de la liste
  64. // Entrée : Prend en paramètre un caractère
  65. // Retour : Retourne la nouvelle tête de liste
  66. //
  67. // ==================================================================
  68.  
  69. t_noeud* empiler(t_pile* a, char car, t_noeud* pt_gauche, t_noeud* pt_droit)
  70. {
  71.  
  72.     t_noeud* noeud;
  73.     noeud = NULL;
  74.  
  75.     t_pile* maillon;
  76.     maillon = NULL;
  77.  
  78.  
  79.     // CREATION D'UN NOEUD
  80.     noeud = creer_noeud(car,pt_gauche, pt_droit);
  81.  
  82.     // CREATION D'UN MAILLON DE LA PILE
  83.     maillon = creer_maillon(noeud);
  84.  
  85.     // INSERTION DU MAILLON
  86.     a = insertion_maillon_en_tete(maillon,&a);
  87.  
  88.  
  89.     return noeud;
  90. }
  91.  
  92. // ==================================================================
  93. // Fonction créer_noeud : Permet de créer un noeud de l'arbre
  94. // ==================================================================
  95.  
  96. t_noeud* creer_noeud(char info, t_noeud* pt_gauche, t_noeud* pt_droit)
  97. {
  98.     t_noeud* noeud;
  99.     noeud = (t_noeud*)malloc(sizeof(t_noeud));
  100.  
  101.     noeud->info = info;
  102.     noeud->pt_suiv_gauche= pt_gauche;
  103.     noeud->pt_suiv_droit= pt_droit;
  104.     return noeud;
  105. }
  106.  
  107. // ==================================================================
  108. // Fonction créer_maillon : Permet de créer un maillon de la liste
  109. // ==================================================================
  110.  
  111. t_pile* creer_maillon(t_noeud* noeud)
  112. {
  113.     t_pile* pile;
  114.     pile = (t_pile*) malloc(sizeof(t_pile));
  115.  
  116.     pile->pt_noeud = noeud;
  117.     pile->pt_suiv = NULL;
  118.     return pile;
  119. }
  120.  
  121. // ==================================================================
  122. // Fonction Insertion : Permet d'insérer un maillon en tête de liste
  123. // ==================================================================
  124.  
  125. t_pile* insertion_maillon_en_tete(t_pile* maillon,t_pile** a)
  126. {
  127.     maillon->pt_suiv = *a; // On copie l'adresse du maillon vers laquelle pointe a, le début de la liste
  128.     *a= maillon; // On fait pointer notre début de liste vers le nouveau maillon inséré
  129.     return *a; // On retourne un pointeur sur la tête de liste
  130. }
  131.  
  132. // ==================================================================
  133. // Fonction Dépiler : Permet de dépiler le premier maillon de la pile
  134. //
  135. // Entrée : Prend en paramètre le début de la liste
  136. // Retour : Retourne le noeud contenu dans le maillon
  137. //
  138. // ==================================================================
  139.  
  140. t_noeud* depiler(t_pile* a) // Permet de dépiler le premier maillon
  141. {
  142.     t_pile* retour; // On créer un retour qui retournera
  143.     retour = a->pt_suiv; // On récupère le maillon qui contiendra le premier noeud
  144.  
  145.     a->pt_suiv = retour->pt_suiv; // Une fois que le noeud à dépilé est trouvé, on fait pointer le début de notre liste vers le maillon suivant
  146.  
  147.     return retour->pt_noeud; // Retourne
  148. }
  149.  
  150.  
  151. // ==================================================================
  152. // Fonction créer_arbre : Permet de créer l'arbre
  153. // ==================================================================
  154.  
  155. t_noeud* creer_arbre(t_noeud** abr, t_pile* a, char chaine[])
  156. {
  157.     printf("On rentre dans créer arbre");
  158.     // Création de deux noeuds permettant de stocker les noeuds retournés par la fonction dépiler
  159.  
  160.     t_noeud* noeud_retourne_1;
  161.     t_noeud* noeud_retourne_2;
  162.  
  163.     t_noeud* noeud;
  164.  
  165.     int j = 0;
  166.  
  167.     while(chaine[j] != '\0' ) // Tant qu'il reste des caractères à traiter
  168.     {
  169.  
  170.             if(noeud->info == '+' || noeud->info == '-' || noeud->info == '*' || noeud->info == '/' || noeud->info == '%') // Si l'info est un opérateur
  171.             {
  172.                 // On dépile les noeuds stockés (= opérandes)
  173.  
  174.                 noeud_retourne_1 = depiler(a->pt_suiv);
  175.                 noeud_retourne_2 = depiler(a->pt_suiv); // Doit normalement marcher puisque dépiler gère dans son coin pour les raccordements
  176.  
  177.                 // On empile le noeud créé
  178.  
  179.                 noeud = empiler(a,chaine[j],noeud_retourne_1,noeud_retourne_2);
  180.             }
  181.  
  182.             else if(noeud->info == '0' || noeud->info == '1' || noeud->info == '2' || noeud->info == '3' || noeud->info == '4' || noeud->info == '5' || noeud->info == '6' || noeud->info == '7' || noeud->info == '8' || noeud->info == '9')
  183.             {
  184.                 empiler(a, chaine[j], NULL, NULL);
  185.             }
  186.     }
  187.     return noeud;
  188. }
  189.  
  190. // ==================================================================
  191.  
  192. void imprime_postfixe(t_noeud *abr)
  193. {
  194.     t_noeud *pt1 = abr;
  195.  
  196.     if(pt1->pt_suiv_gauche == NULL && pt1->pt_suiv_droit == NULL)
  197.     {
  198.         printf("%c ",pt1->info);
  199.     }
  200.     else
  201.     {
  202.         printf("(");
  203.         imprime_postfixe(pt1->pt_suiv_gauche);
  204.         imprime_postfixe(pt1->pt_suiv_droit);
  205.         printf("%c) ",pt1->info);
  206.     }
  207. }
  208.  
  209. // ==================================================================
  210.  
  211. void imprime_infixe(t_noeud *abr)
  212. {
  213.     if(abr->pt_suiv_gauche == NULL && abr->pt_suiv_droit == NULL)
  214.     {
  215.         printf("%c ",abr->info);
  216.     }
  217.     else
  218.     {
  219.         printf("(");
  220.         imprime_infixe(abr->pt_suiv_gauche);
  221.         printf("%c ",abr->info);
  222.         imprime_infixe(abr->pt_suiv_gauche);
  223.         printf(") ");
  224.     }
  225. }
Add Comment
Please, Sign In to add comment