yanni_yagami

TP5

Jun 10th, 2020
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 10.77 KB | None | 0 0
  1.  #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <stdbool.h>
  4.  
  5. //*Soit la structure de donnΓ©es suivante
  6. typedef struct list
  7. {
  8.     int number;
  9.     struct list *next;
  10.  
  11. } listElement, *List;
  12.  
  13. //*Protopypes
  14. List new_list(void);
  15. bool is_empty_list(List li);
  16. int length_list(List li);
  17. int sum_list(List li);
  18. void print_list(List li);
  19. List push_back_list(List li, int number);
  20. List push_front_list(List li, int number);
  21. List pop_back_list(List li);
  22. List pop_front_list(List li);
  23. void free_list(List li);
  24. List reverse_list(List li);
  25. List sort_list(List li);
  26. List insert_in_sorted_list(List li, int number);
  27. int **create_mat(int c, int l);
  28. void get_values_mat(int **mat, int c, int l);
  29. void print_mat(int **mat, int c, int l);
  30. List *mat_to_listArr(int **mat, int c, int l);
  31. List *delete_column_array(List *tab, int *c, int col);
  32. void print_tab(List *tab, int c, int l);
  33. List *multiply(List *tab1, int c1, int l1, List *tab2, int c2, int l2, int *c3, int *l3);
  34. bool is_able_multiply(int c, int l);
  35. int get_number(List li, int number);
  36.  
  37. int main(void)
  38. {
  39.     List liste = new_list();
  40.     int insert;
  41.  
  42.     liste = push_back_list(liste, 23);
  43.     liste = push_back_list(liste, 11);
  44.     liste = push_back_list(liste, 2);
  45.     liste = push_back_list(liste, 4);
  46.  
  47.     print_list(liste);
  48.  
  49.     printf("la somme des elements de la liste : %d\n", sum_list(liste));
  50.  
  51.     printf("\n  -> inversement d'ordre de la liste ...\n\n");
  52.     liste = reverse_list(liste);
  53.     print_list(liste);
  54.     printf("\n  -> trie de la liste ...\n");
  55.     liste = sort_list(liste);
  56.     print_list(liste);
  57.     printf("\nveillez entrer un nombre a inserer dans la liste triee : ");
  58.     scanf("%d", &insert);
  59.     printf("\n  -> insertion de la valeur %d dans la liste triee ...\n\n", insert);
  60.     liste = insert_in_sorted_list(liste, insert);
  61.     print_list(liste);
  62.  
  63.     free_list(liste);
  64.     printf("\n---------------------------------------------------------------\n");
  65.  
  66.     int c1, l1, c2, l2, cas;
  67.  
  68.     /*--------------------------------------------------------------------*/
  69.  
  70.     printf("veillez entrer le taille de la premiere matrice (LxC): ");
  71.     scanf("%dx%d", &l1, &c1);
  72.  
  73.     int **mat1 = create_mat(c1, l1);
  74.  
  75.     printf("veillez entrer les valeurs de la premiere matrice :\n");
  76.     get_values_mat(mat1, c1, l1);
  77.  
  78.     /*--------------------------------------------------------------------*/
  79.  
  80.     printf("veillez entrer le taille de la deuxieme matrice (LxC): ");
  81.     scanf("%dx%d", &l2, &c2);
  82.  
  83.     int **mat2 = create_mat(c2, l2);
  84.  
  85.     printf("veillez entrer les valeurs de la deuxieme matrice :\n");
  86.     get_values_mat(mat2, c2, l2);
  87.  
  88.     /*--------------------------------------------------------------------*/
  89.  
  90.     printf("\n  -> transformation des deux matrices en tableaux de listes chainees ...\n\n");
  91.     List *tab1 = mat_to_listArr(mat1, c1, l1);
  92.     List *tab2 = mat_to_listArr(mat2, c2, l2);
  93.  
  94.     do
  95.     {
  96.         printf("veillez entrer la colonne a supprimer des deux tableaux (0 pour passer) : ");
  97.         scanf("%d", &cas);
  98.         if (cas == 0)
  99.             break;
  100.     } while (cas > c1 || cas > c2);
  101.  
  102.     if (cas != 0)
  103.     {
  104.         printf("\n  -> supression des colonnes ...");
  105.         tab1 = delete_column_array(tab1, &c1, cas);
  106.         tab2 = delete_column_array(tab2, &c2, cas);
  107.     }
  108.  
  109.     printf("\n  -> realisation du produit matriciel ...\n\n");
  110.  
  111.     int c3, l3;
  112.     List *tab3 = multiply(tab1, c1, l1, tab2, c2, l2, &c3, &l3);
  113.  
  114.     print_tab(tab3, c3, l3);
  115.  
  116.     free(tab1);
  117.     free(tab2);
  118.     free(mat1);
  119.     free(mat2);
  120.     free(tab3);
  121.     return 0;
  122. }
  123.  
  124. List new_list(void)
  125. {
  126.     return NULL;
  127. }
  128.  
  129. bool is_empty_list(List li)
  130. {
  131.     if (li == NULL)
  132.         return true;
  133.     return false;
  134. }
  135.  
  136. int length_list(List li)
  137. {
  138.     int cpt = 0;
  139.  
  140.     if (!is_empty_list(li))
  141.     {
  142.         listElement *tmp = li;
  143.         while (tmp != NULL)
  144.         {
  145.             cpt++;
  146.             tmp = tmp->next;
  147.         }
  148.     }
  149.  
  150.     return cpt;
  151. }
  152.  
  153. void print_list(List li)
  154. {
  155.     printf("les elements de la liste:\n");
  156.     if (is_empty_list(li))
  157.     {
  158.         printf("\tRien a afficher, la liste est vide.\n\n");
  159.         return;
  160.     }
  161.     listElement *tmp = li;
  162.  
  163.     while (tmp != NULL)
  164.     {
  165.         printf("  [%02d]\n", tmp->number);
  166.         tmp = tmp->next;
  167.     }
  168. }
  169.  
  170. int sum_list(List li)
  171. {
  172.     int cpt = 0;
  173.  
  174.     if (!is_empty_list(li))
  175.     {
  176.         listElement *tmp = li;
  177.  
  178.         while (tmp != NULL)
  179.         {
  180.             cpt += tmp->number;
  181.             tmp = tmp->next;
  182.         }
  183.     }
  184.  
  185.     return cpt;
  186. }
  187.  
  188. List push_back_list(List li, int number)
  189. {
  190.     listElement *element;
  191.  
  192.     element = malloc(sizeof(*element));
  193.     if (element == NULL)
  194.     {
  195.         fprintf(stderr, "erreur d'allocation dynamique.\n");
  196.         exit(EXIT_FAILURE);
  197.     }
  198.  
  199.     element->number = number;
  200.     element->next = NULL;
  201.  
  202.     if (is_empty_list(li))
  203.         return element;
  204.  
  205.     listElement *tmp;
  206.  
  207.     tmp = li;
  208.  
  209.     while (tmp->next != NULL)
  210.         tmp = tmp->next;
  211.  
  212.     tmp->next = element;
  213.  
  214.     return li;
  215. }
  216.  
  217. List push_front_list(List li, int number)
  218. {
  219.     listElement *element;
  220.  
  221.     element = malloc(sizeof(*element));
  222.     if (element == NULL)
  223.     {
  224.         fprintf(stderr, "erreur d'allocation dynamique.\n");
  225.         exit(EXIT_FAILURE);
  226.     }
  227.  
  228.     element->number = number;
  229.     element->next = li;
  230.  
  231.     return element;
  232. }
  233.  
  234. List pop_back_list(List li)
  235. {
  236.     if (is_empty_list(li))
  237.         return new_list();
  238.  
  239.     if (li->next == NULL)
  240.     {
  241.         free(li);
  242.         return new_list();
  243.     }
  244.  
  245.     listElement *tmp = li, *previous;
  246.  
  247.     while (tmp->next != NULL)
  248.     {
  249.         previous = tmp;
  250.         tmp = tmp->next;
  251.     }
  252.     previous->next = NULL;
  253.     free(tmp);
  254.     tmp = NULL;
  255.  
  256.     return li;
  257. }
  258.  
  259. List pop_front_list(List li)
  260. {
  261.     if (is_empty_list(li))
  262.         return new_list();
  263.  
  264.     if (li->next == NULL)
  265.     {
  266.         free(li);
  267.         return new_list();
  268.     }
  269.  
  270.     listElement *tmp = li->next;
  271.     free(li);
  272.     return tmp;
  273. }
  274.  
  275. void free_list(List li)
  276. {
  277.     if (is_empty_list(li))
  278.     {
  279.         free(li);
  280.         return;
  281.     }
  282.  
  283.     while (li != NULL)
  284.         li = pop_front_list(li);
  285.     free(li);
  286.     return;
  287. }
  288.  
  289. List reverse_list(List li)
  290. {
  291.     if (is_empty_list(li))
  292.         return NULL;
  293.  
  294.     listElement *element;
  295.  
  296.     element = malloc(sizeof(*element));
  297.     if (element == NULL)
  298.     {
  299.         fprintf(stderr, "erreur d'allocation dynamique.\n");
  300.         exit(EXIT_FAILURE);
  301.     }
  302.  
  303.     element->number = li->number;
  304.     element->next = NULL;
  305.  
  306.     li = li->next;
  307.  
  308.     while (li != NULL)
  309.     {
  310.         element = push_front_list(element, li->number);
  311.         li = li->next;
  312.     }
  313.     return element;
  314. }
  315.  
  316. List sort_list(List li)
  317. {
  318.     if (is_empty_list(li))
  319.         return li;
  320.  
  321.     listElement *tmp = li, *element;
  322.     int swap;
  323.  
  324.     element = tmp->next;
  325.     while (tmp->next != NULL)
  326.     {
  327.         while (element != NULL)
  328.         {
  329.             if (tmp->number > element->number)
  330.             {
  331.                 swap = tmp->number;
  332.                 tmp->number = element->number;
  333.                 element->number = swap;
  334.             }
  335.             element = element->next;
  336.         }
  337.         tmp = tmp->next;
  338.         element = tmp->next;
  339.     }
  340.     return li;
  341. }
  342.  
  343. List insert_in_sorted_list(List li, int number)
  344. {
  345.     listElement *element;
  346.  
  347.     element = malloc(sizeof(*element));
  348.  
  349.     if (element == NULL)
  350.     {
  351.         fprintf(stderr, "erreur d'allocation dynamique.\n");
  352.         exit(EXIT_FAILURE);
  353.     }
  354.  
  355.     element->number = number;
  356.     element->next = NULL;
  357.  
  358.     if (is_empty_list(li))
  359.     {
  360.         return element;
  361.     }
  362.  
  363.     listElement *tmp = li, *previous;
  364.  
  365.     while (tmp->number < number && tmp->next != NULL)
  366.     {
  367.         previous = tmp;
  368.         tmp = tmp->next;
  369.     }
  370.  
  371.     if (tmp->next == NULL && tmp->number < number)
  372.         tmp->next = element;
  373.  
  374.     else
  375.     {
  376.         element->next = tmp;
  377.         previous->next = element;
  378.     }
  379.  
  380.     return li;
  381. }
  382.  
  383. int **create_mat(int c, int l)
  384. {
  385.     int **mat;
  386.  
  387.     mat = malloc(sizeof(*mat) * c);
  388.  
  389.     for (int i = 0; i < c; i++)
  390.         mat[i] = (int *)malloc(sizeof(int) * l);
  391.  
  392.     if (mat == NULL)
  393.     {
  394.         fprintf(stderr, "erreur d'allocation dynamyque.\n");
  395.         exit(EXIT_FAILURE);
  396.     }
  397.  
  398.     return mat;
  399. }
  400.  
  401. void get_values_mat(int **mat, int c, int l)
  402. {
  403.     for (int i = 0; i < c; i++)
  404.         for (int j = 0; j < l; j++)
  405.         {
  406.             printf("matrice[%d][%d] = ", j, i);
  407.             scanf("%d", &mat[i][j]);
  408.         }
  409. }
  410.  
  411. void print_mat(int **mat, int c, int l)
  412. {
  413.     for (int i = 0; i < c; i++)
  414.     {
  415.         for (int j = 0; j < l; j++)
  416.         {
  417.             printf("[%02d] ", mat[i][j]);
  418.         }
  419.         printf("\n");
  420.     }
  421. }
  422.  
  423. List *mat_to_listArr(int **mat, int c, int l)
  424. {
  425.     List *arr;
  426.     arr = malloc(sizeof(*arr) * c);
  427.     if (arr == NULL)
  428.     {
  429.         fprintf(stderr, "erreur d'allocation dynamique.\n");
  430.         exit(EXIT_FAILURE);
  431.     }
  432.  
  433.     for (int i = 0; i < c; i++)
  434.         for (int j = 0; j < l; j++)
  435.             arr[i] = push_back_list(arr[i], mat[i][j]);
  436.  
  437.     return arr;
  438. }
  439.  
  440. // delete_column_array(<tableau_de_listes>, <adresse_taille_tabeau>, <index_colonne_a_supprimer)
  441. List *delete_column_array(List *tab, int *c, int col)
  442. {
  443.     if (col > *c || col == 0)
  444.     {
  445.         printf("impossible de supprimer la colonne '%d',\nla matrice ne contient que %d colonnes.\n", col, *c);
  446.         return tab;
  447.     }
  448.  
  449.     *c = *c - 1;
  450.  
  451.     for (int i = col - 1; i < *c; i++)
  452.         tab[i] = tab[i + 1];
  453.  
  454.     return tab;
  455. }
  456.  
  457. void print_tab(List *tab, int c, int l)
  458. {
  459.     for (int i = 0; i < l; i++)
  460.     {
  461.         for (int j = 0; j < c; j++)
  462.             printf("[%d] ", get_number(tab[j], i));
  463.         printf("\n");
  464.     }
  465. }
  466.  
  467. List *multiply(List *tab1, int c1, int l1, List *tab2, int c2, int l2, int *c3, int *l3)
  468. {
  469.     if (!is_able_multiply(c1, l2))
  470.     {
  471.         printf("impossible de multiplier les matrices.\n");
  472.         return NULL;
  473.     }
  474.  
  475.     *c3 = c2;
  476.     *l3 = l1;
  477.  
  478.     int **mat = create_mat(*c3, *l3);
  479.  
  480.     int x, y;
  481.     int somme;
  482.     for (int i = 0; i < l1; i++)
  483.         for (int j = 0; j < c2; j++)
  484.         {
  485.             somme = 0;
  486.             for (int k = 0; k < c1; k++)
  487.             {
  488.                 somme += get_number(tab1[k], i) * get_number(tab2[j], k);
  489.             }
  490.             mat[j][i] = somme;
  491.         }
  492.  
  493.     return mat_to_listArr(mat, *c3, *l3);
  494. }
  495.  
  496. bool is_able_multiply(int c, int l)
  497. {
  498.     if (c == l)
  499.         return true;
  500.  
  501.     return false;
  502. }
  503.  
  504. int get_number(List li, int number)
  505. {
  506.     if (number >= length_list(li))
  507.     {
  508.         return 0;
  509.     }
  510.  
  511.     listElement *tmp = li;
  512.  
  513.     for (int i = 0; i < number; i++)
  514.         tmp = tmp->next;
  515.     return tmp->number;
  516. }
Add Comment
Please, Sign In to add comment