TP 4 : Tableaux dynamiques 
On considère la structure suivante de tableau dynamique :
typedef struct darray {
int* t; // tableau utilisé pour stocker les éléments
int size; // nombre d'éléments
int capacity; // taille de t
} darray;
On a toujours size $\leq$ capacity et les éléments après l'indice size sont ignorés (ils sont juste là pour avoir de la place pour les prochaines insertions).
Exercice
Écrire une fonction empty de prototype darray* empty() renvoyant un pointeur sur un darray vide (avec t, size, ¢apacity égaux à NULL, 0, 0, respectivement).
Solution
darray* empty() {
darray* d = (darray*)malloc(sizeof(darray));
d->t = NULL;
d->size = 0;
d->capacity = 0;
return d;
}
Exercice
Écrire une fonction void print_darray(darray*) permettant d'afficher les éléments d'un darray.
Solution
void print_darray(darray* d) {
for(int i = 0; i < d->size; i++)
printf("%d", d->t[i]);
}
Exercice
Écrire une fonction copy de prototype void copy(int*, int*, n) telle que copy(t1, t2, n) recopie les n premiers éléments du tableau t1 dans le tableau t2.
Solution
void copy(int* t1, int* t2, int n) {
for(int i = 0; i < n; i++)
t2[i] = t1[i];
}
Exercice
Écrire une fonction void add(darray*, int) telle que add(darray* d, int e) ajoute e à d. Si la capacité de d est insuffisante, on crééra un nouveau tableau t de taille deux fois plus grande.
Attention : Ne pas oublier le free.
Solution
void add(darray* d, int e) {
if(d->size == d->capacity) {
int* tmp = d->t; // conserve a->t pour pouvoir le free ensuite
d->capacity *= 2;
d->t = (int*)malloc(sizeof(int)*d->capacity);
copy(tmp, d->t, d->size);
free(tmp);
}
d->t[d->size] = e;
d->size++;
}
darray* d = empty();
for(int i = 0; i < 4; i++)
add(d, i);
print_darray(d);
0123