Если вам не нужна строгая индексация массива, вы можете создать псевдосвязанный список (я знаю, что есть имя для этого типа данных, но я не могу его запомнить сейчас):
struct listish {
int *arr
size_t size;
struct listish *next;
};
Функция «индексирования» будет выглядеть так:
int *index(struct listish *list, size_t i)
{
if(list == NULL) return NULL; // index out of bounds
if(i < list->size) return list->arr + i; // return a pointer to the element
else return index(list->next, i - list->size); // not in this array - go to next node
}
Идея состоит в том, чтобы объединить переупорядочение на месте связанного списка с непрерывным пространством массива. В этом случае index(list, 4)
вернет &a[4]
, а index(list, 5)
вернет &b[0]
, имитируя непрерывное индексирование без перераспределения и перемещения всего массива - все, что вам нужно сделать, - это выделить несколько небольших struct listish
объектов и установить их правильно, задача, которую я оставляю вам.