Advertisement
Guest User

Untitled

a guest
Dec 6th, 2019
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.36 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. #define INITIAL_CAPACITY 4
  5.  
  6. typedef struct elem_s // for example purspose
  7. {
  8.     int data;
  9. } elem_t;
  10.  
  11. typedef struct arr_s // to define in .c file - no direct access from outside this file
  12. {
  13.     elem_t** elems_arr;
  14.     int size;
  15.     int capacity;
  16. } arr_t;
  17.  
  18. void init_arr(arr_t* arr)  // private - not to declare in header file
  19. {
  20.     arr->elems_arr = malloc(INITIAL_CAPACITY*sizeof(elem_t*));
  21.    
  22.     for (int i=0; i<INITIAL_CAPACITY; i++)
  23.     {
  24.         arr->elems_arr[i] = NULL;
  25.     }
  26.    
  27.     arr->size = 0;
  28.     arr->capacity = INITIAL_CAPACITY;
  29. }
  30.  
  31. void increase_capacity(arr_t* arr) // private - not to declare in header file
  32. {
  33.     int new_capacity = 2*arr->capacity;
  34.     arr->elems_arr = realloc(arr->elems_arr, new_capacity*sizeof(elem_t*));
  35.    
  36.     for (int i=(arr->capacity); i<new_capacity; i++)
  37.     {
  38.         arr->elems_arr[i] = NULL;
  39.     }
  40.    
  41.     arr->capacity = new_capacity;
  42. }
  43.  
  44. void push(arr_t* arr, elem_t* elem)
  45. {  
  46.     if (arr->elems_arr == NULL)
  47.     {
  48.         init_arr(arr);
  49.     }
  50.    
  51.     int* capacity_ptr = &(arr->capacity);
  52.     int* size_ptr = &(arr->size);
  53.  
  54.     if (*size_ptr == *capacity_ptr)
  55.     {
  56.         increase_capacity(arr);
  57.     }
  58.  
  59.     arr->elems_arr[*size_ptr] = elem;
  60.     (*size_ptr)++;
  61. }
  62.  
  63. void clear (arr_t* arr)
  64. {
  65.     for (int i=0; i<(arr->size); i++)
  66.     {
  67.         if(arr->elems_arr[i] != NULL)
  68.         {
  69.             free(arr->elems_arr[i]);
  70.             arr->elems_arr[i] = NULL;
  71.         }
  72.     }
  73.     free(arr->elems_arr);
  74. }
  75.  
  76. void print_data (const arr_t* arr) // for example pursposes
  77. {
  78.     for (int i=0; i<(arr->size); i++)
  79.     {
  80.         printf("%d ", (arr->elems_arr[i])->data);
  81.     }
  82.     printf("\n");
  83. }
  84.  
  85. elem_t* create_elem (int data) // for example purposes
  86. {
  87.     elem_t* elem = malloc(sizeof(elem_t));
  88.     elem->data = data;
  89.  
  90.     return elem;
  91. }
  92.  
  93. int main()
  94. {
  95.     arr_t* arr = malloc(sizeof(arr_t));
  96.    
  97.     elem_t* first_el = create_elem(1);
  98.     push(arr, first_el);
  99.  
  100.     elem_t* second_el = create_elem(5);
  101.     push(arr, second_el);
  102.    
  103.     elem_t* third_el = create_elem(3);
  104.     push(arr, third_el);
  105.    
  106.     elem_t* fourth_el = create_elem(4);
  107.     push(arr, fourth_el);
  108.    
  109.     elem_t* fifth_el = create_elem(6);
  110.     push(arr, fifth_el);
  111.    
  112.     print_data(arr);
  113.     clear(arr);
  114.     free(arr);
  115.  
  116.     return 0;
  117. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement