1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113
|
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
typedef void * (* t_data_default_init)();
typedef void (* t_data_reset_to_init)(void * p_data);
typedef void (* t_data_cpy)(void *p_data_dst, void *p_data_src);
typedef struct struct_vector{
size_t nbElement;
void* element;
t_data_default_init data_default_init;
t_data_reset_to_init data_reset_to_init;
t_data_cpy data_cpy;
size_t size_of_data;
}s_vector;
typedef s_vector* p_s_vector;
void my_struct_default_init(p_s_vector p_vector){
p_vector->nbElement = 0;
p_vector->element = NULL;
}
void my_struct_reset_to_default(p_s_vector p_vector){
p_vector->nbElement = 0;
if(p_vector->element != NULL){
free(p_vector->element);
p_vector->element = NULL;
}
}
void my_struct_copy(p_s_vector p_dest, p_s_vector p_src){
p_dest->nbElement = p_src->nbElement;
p_dest->element = malloc(sizeof(p_src->size_of_data) * (p_src->nbElement + 1));
strcpy(p_dest->element, p_src->element);
}
p_s_vector vector_alloc(size_t n, size_t size_of_data, t_data_default_init data_default_init
, t_data_reset_to_init data_reset_to_init, t_data_cpy data_cpy){
p_s_vector vect = malloc(sizeof(s_vector));
vect->size_of_data = size_of_data;
vect->data_default_init = data_default_init;
vect->data_reset_to_init = data_reset_to_init;
vect->data_cpy = data_cpy;
vect->nbElement = n;
vect->element = malloc(n * vect->size_of_data);
for(int i=0; i<n; i++){
vect->data_default_init(vect->element + (i * vect->size_of_data));
//vect->element[i] = data_default_init(vect->size_of_data);
}
// p_s_vector vect = malloc(sizeof(s_vector));
// vect->nbElement = n;
// vect->element = malloc(sizeof(double) * n);
// for(int i=0; i<n; i++){
// vect->element[i] = i;
// }
return vect;
}
void vector_free(p_s_vector p_vector){
for(int i=0; i<p_vector->nbElement; i++){
p_vector->data_reset_to_init(p_vector->element + i*p_vector->size_of_data);
//p_vector->element[i] = data_reset_to_init(p_vector->size_of_data);
}
free(p_vector->element);
p_vector->element = NULL;
free(p_vector);
p_vector = NULL;
}
void vector_insert(p_s_vector p_vector, size_t i, void * v){
if(i < 0 || i > p_vector->nbElement)
exit(0);
else{
p_vector->nbElement++;
void * temp = (void*) malloc(p_vector->size_of_data * (p_vector->nbElement));
for(int k=0; k<i; k++){
p_vector->data_cpy(temp + k * (p_vector->size_of_data), p_vector->element +k*(p_vector->size_of_data));
p_vector->data_reset_to_init(p_vector->element +k*(p_vector->size_of_data));
}
p_vector->data_cpy(temp + i * (p_vector->size_of_data), v);
for(int k=i; k<p_vector->nbElement; k++){
p_vector->data_cpy(temp + (k+1) * (p_vector->size_of_data), p_vector->element +k*(p_vector->size_of_data));
p_vector->data_reset_to_init(p_vector->element +k*(p_vector->size_of_data));
}
free(p_vector->element);
p_vector->element = temp;
}
}
int main(){
size_t n = 4;
p_s_vector tab = vector_alloc(n,sizeof(char), my_struct_default_init, my_struct_reset_to_default, my_struct_copy);
vector_insert(tab, 2, 'c');
for(int i = 0; i<tab->nbElement; i++)
printf("%c\n",tab->element+i*tab->size_of_data);
vector_free(tab);
return 0;
} |
Partager