Придерживаясь массивов:
Если вы удвоите буфер и скопируете массив в его собственный конец, вы можете использовать
void rotate_left(int **array, size_t size, size_t *shiftd){
if(++*shiftd >= size){
*shiftd %= size;
*array -= size;
}
++*array;
}
Предполагая, что функция init()
работает так же много раз, как выможет создать массив следующим образом:
int *array = malloc(2 * size * sizeof(int));
init(array, size);
init(array + size, size);
size_t shiftd = 0;
И использовать функцию вращения
rotate_left(&array, size, &shiftd);
Это должно продемонстрировать процесс сдвига
array
v
[1|2|3|1|2|3]
------- size = 3, shiftd = 0
[1|2|3]
***rotate_left(&array, size, &shiftd);***
array
v
[1|2|3|1|2|3]
------- size = 3, shiftd = 1
[2|3|1]
***rotate_left(&array, size, &shiftd);***
array
v
[1|2|3|1|2|3]
------- size = 3, shiftd = 2
[3|1|2]
***rotate_left(&array, size, &shiftd);***
array
v
[1|2|3|1|2|3]
------- size = 3, shiftd = 0
[1|2|3]
Это, однако, неработа со строками с нулем в конце.