Завёл бы массив указателей на блоки и зарезервировал бы память под сами блоки. Добавление, удаление и изменение размера блока - только через функции. Доступ к блокам - только по указателям из массива. Допустим, Вы хотите удалить блок. Вызываете соотв. функцию, она смещает все занятые блоки, расположенные выше удалённого вниз на размер удалённого и меняет указатели в массиве. Указатель на удалённый блок - обнуляет. Новый блок создаётся выше всех занятых а указатель на него заносится в свободный (нулевой) элемент массива. Идентификатором блока является индекс указателя на него в массиве.