Advertisement
anthonimes

TP5---EXO1

Nov 6th, 2020 (edited)
375
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.94 KB | None | 0 0
  1. #include "liste_python.h"
  2.  
  3. liste creation_liste_vide() {
  4.     liste l = malloc( sizeof(struct liste) );
  5.     (*l).nombre_elements = 0;
  6.     (*l).blocs_alloues = 0;
  7.     (*l).objets_liste = NULL;
  8.  
  9.     return l;
  10. }
  11.  
  12. static void reallouer_liste(liste l, size_t nouvelle_taille) {
  13.  
  14.     size_t blocs_alloues = (*l).blocs_alloues;
  15.     (*l).nombre_elements = nouvelle_taille;
  16.    
  17.     if(blocs_alloues >= nouvelle_taille && nouvelle_taille >= (blocs_alloues / 2)) {
  18.         puts("reallocation inutile");
  19.     }
  20.  
  21.     else {
  22.         // pattern : 0, 4, 8, 16, 25, 35, 46, 58, 72, 88, ...
  23.         int a_allouer = (nouvelle_taille >> 3) + (nouvelle_taille < 9 ? 3 : 6);
  24.         a_allouer += nouvelle_taille;
  25.  
  26.         (*l).objets_liste = realloc((*l).objets_liste, (a_allouer) * sizeof(int*));
  27.  
  28.         if((*l).objets_liste == NULL)
  29.             fprintf(stderr, "erreur lors de la reallocation de la liste");
  30.  
  31.         (*l).blocs_alloues = a_allouer;
  32.     }
  33.  
  34.     printf("%ld %ld\n", (*l).blocs_alloues, nouvelle_taille);
  35. }
  36.  
  37. void ajout_fin(liste l, int *valeur) {
  38.     size_t nombre_elements = (*l).nombre_elements;
  39.     reallouer_liste(l, nombre_elements+1);
  40.     l->objets_liste[l->nombre_elements-1] = valeur;
  41. }
  42.  
  43. // TODO : vérifier que la position est valide
  44. void inserer_position(liste l, int* valeur, unsigned int position) {
  45.  
  46. }
  47.  
  48. static void detruire_element(int **e) {
  49.     free(*e);
  50.     *e = NULL;
  51. }
  52.  
  53. int* pop(liste l) {
  54.     size_t nombre_elements = (*l).nombre_elements;
  55.  
  56.     int *valeur = malloc( sizeof(int) );
  57.     *valeur = *((*l).objets_liste[nombre_elements-1]);
  58.  
  59.     detruire_element(&(*l).objets_liste[nombre_elements-1]);
  60.     reallouer_liste(l, nombre_elements-1);
  61.  
  62.     return valeur;
  63.  
  64. }
  65.  
  66. void detruire_liste(liste* l) {
  67.  
  68.     for(unsigned int i = 0; i < (**l).nombre_elements; i++)
  69.         detruire_element(&(**l).objets_liste[i]);
  70.  
  71.     free((**l).objets_liste);
  72.     (**l).objets_liste = NULL;
  73.     free(*l);
  74.     *l = NULL;
  75.  
  76. }
  77.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement