Повернуть влево массив в C без для? - PullRequest
0 голосов
/ 30 ноября 2018

Я пишу код, и мне нужно вращать массив влево много раз.Проблема в том, что я использую цикл for.

Когда мне нужно использовать функцию с коротким массивом, это быстро.Но как только я использую массив из 10.000 элементов и более, он становится действительно длинным из-за цикла for.

Итак, я хотел бы знать, есть ли другой способ вращения массива в C, для которого не требуется for или while (или любой другой цикл)?

void rotate_left(int *array, int size)
{
    int nb = array[0];

    for (int i = 0; i < size; i++) {
        array[i] = array[i + 1];
    }
    array[size - 1] = nb;
}

Ответы [ 2 ]

0 голосов
/ 30 ноября 2018

Придерживаясь массивов:

Если вы удвоите буфер и скопируете массив в его собственный конец, вы можете использовать

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]

Это, однако, неработа со строками с нулем в конце.

0 голосов
/ 30 ноября 2018

Есть ли способ вращать массив в C без цикла?

Нет .

Массивы хранятся в непрерывной памяти,поэтому любое смещение означает линейный доступ к его элементам.

По крайней мере, не ясный.Я имею в виду круговой буфер , который использует буфер фиксированного размера, но он сложнее массива.Например, когда этот буфер заполняется, вам нужно перезаписать самый старый элемент новым.Я думаю, что вы не хотите этого.


Я пишу код, и мне нужно вращать массив влево много раз.

Это кричит об использовании простого связанного списка вместо массива.

В случае списка вам просто нужно переместить узел в начале списка в конец списка.

Если вы ищете в Интернете «повернуть влево в простой связанный список»,Вы найдете множество примеров.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...