C 无指针的双向圆形阵列算法

C 无指针的双向圆形阵列算法,c,arrays,algorithm,circular-buffer,C,Arrays,Algorithm,Circular Buffer,我有一个由26个英文字母组成的数组。说: char a[26] = ['a','b','c','d'.......so on till ....'z'] 我需要以循环方式移动阵列中的元素(可以是顺时针或逆时针) 我知道存在一种称为圆形数组的数据结构,但它是单向的 比方说,我想将数组中的每个元素向前移动3个元素,然后按新数组移动应为: char new[26] = ['x','y','z','a','b'... and so on till 'w'] char new[26]=['c','d'

我有一个由26个英文字母组成的数组。说:

char a[26] = ['a','b','c','d'.......so on till ....'z']
我需要以循环方式移动阵列中的元素(可以是顺时针或逆时针)

我知道存在一种称为圆形数组的数据结构,但它是单向的

比方说,我想将数组中的每个元素向前移动3个元素,然后按新数组移动应为:

char new[26] = ['x','y','z','a','b'... and so on till 'w']
char new[26]=['c','d','e'....and so on... 'y','z','a','b']
但是,我可能还想将元素向后移动2个元素,那么我的新数组应该是:

char new[26] = ['x','y','z','a','b'... and so on till 'w']
char new[26]=['c','d','e'....and so on... 'y','z','a','b']
所有这些都应该在不使用指针的情况下完成(因为我还没有读过指针)

有没有一种方法可以实现这一点

我已经搜索了很多关于圆形数组的内容,但是我从来没有意识到简单数组可以用作圆形数组,并且元素可以前后移动。有没有人能告诉我有没有办法做到这一点

数组大小是固定的


我们使用C进行编码

您只需在数组
索引上使用模数

size_t index;
size_t move_index(int pos_or_neg_steps) {
    return (index + pos_or_neg_steps) % 26;
}

O(1)
额外的内存和
O(n^2)
时间

C
code(朴素):

void shiftElements(int *array, int size, int shift) {
  int i,reverse;

  reverse = shift < 0;
  if(shift < 0)
    shift = -shift;
  if(shift > size) 
    shift %= size;

  for(i=0; i < shift; ++i) {
    if(reverse)
      shiftForward(array,size);
    else
      shiftBackwards(array,size);
  }
}

void shiftForward(int *array, int size) {
  int tmp = array[size-1];
  int i;
  for(i=size; i>0; --i)
    array[i] = array[i-1]; 
  array[0] = tmp;
}

void shiftBackward(int *array, int size) {
  int tmp = array[0];
  int i;
  for(i=0; i<size; ++i)
    array[i] = array[i+1]; 
  array[size-1] = tmp;
}
void shiftElements(int *array, int size, int shift) {
  int i,reverse,absVal,*tmp;

  reverse = shift < 0;
  absVal  = shift < 0 ? -shift : shift;
  if(shift > size) 
    shift %= size;
  *tmp = malloc(shift * sizeof *array);

  for(i=0; i < absVal; ++i)
    tmp[i] = array[size-shift+i];

  for(i=0; i < size; ++i)
    array[(i+shift)%size] = array[i];

  for(i=0; i < absVal; ++i)
    array[size+shift+i] = tmp[i];
  free(tmp);
} // I still need to test some corner cases, but you should get the idea

请给我们看一下你的代码。没有什么比圆形数组更好的了……你必须让你的数组表现得像圆形数组一样。如果索引不是你的指针,我建议使用向前或向后模26的索引。