Изучить принципы работы аллокаторов памяти, реализовать два типа аллокаторов (linear-аллокатор и pool-аллокатор), а также создать структуры данных (хэш-таблицу, динамический массив и очередь), использующие эти аллокаторы для управления памятью.
void* linear_alloc(void* allocator, size_t size) — выделение памяти.void linear_reset(void* allocator) — сброс аллокатора (освобождение всей выделенной памяти).void* pool_alloc(void* allocator) — выделение одного блока памяти.void pool_free(void* allocator, void* ptr) — освобождение одного блока памяти.void arraylist_init(ArrayList* list, Allocator* allocator) — инициализация массива.void arraylist_add(ArrayList* list, void* data, size_t index) — добавление элемента.void* arraylist_get(ArrayList* list, size_t index) — получение элемента по индексу.void arraylist_del(ArrayList* list, size_t index) — удаление элемента по индексу.void arraylist_free(ArrayList* list) — освобождение памяти.void hashtable_init(HashTable* table, size_t capacity, Allocator* allocator) — инициализация таблицы.void hashtable_insert(HashTable* table, const char* key, void* value) — вставка элемента.void* hashtable_get(HashTable* table, const char* key) — получение значения по ключу.void hashtable_del(HashTable* table, const char* key) — удаление по ключуvoid hashtable_free(HashTable* table) — освобождение памяти.