Создать новый массив такого размера, чтобы туда уместился новый элемент, скопировать в него элементы из старого массива, удалить старый массив, записать в пустое место нужный элемент.
С удалением всё аналогично.
std::vector делает всё примерно то же самое, только он не создаёт новый массив при удалении (если не вызвать truncate), а просто уменьшает счётчик занятых элементов, да и при добавлении новых элементов создаёт массив с запасом.