C 无指针的双向圆形阵列算法
我有一个由26个英文字母组成的数组。说: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'
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的索引。