Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 数组中的移位元素_C_Arrays_Recursion_Copy - Fatal编程技术网

C 数组中的移位元素

C 数组中的移位元素,c,arrays,recursion,copy,C,Arrays,Recursion,Copy,这是基本的,但我的谷歌搜索并不能解决这个问题。我知道我必须做一些其他的事情来逐个移动数组的值,但是下面的编码为items[k]到items[infinity]提供了相同的值,所有相等的items[k]。我不明白的是,当我将k值复制到k+1插槽中时,如何保留原始k+1值 if ( i < numItems) //if i is inside the used boundaries of the array { for (int k = i; k < numItems; k++)

这是基本的,但我的谷歌搜索并不能解决这个问题。我知道我必须做一些其他的事情来逐个移动数组的值,但是下面的编码为items[k]到items[infinity]提供了相同的值,所有相等的items[k]。我不明白的是,当我将k值复制到k+1插槽中时,如何保留原始k+1值

if ( i < numItems) //if i is inside the used boundaries of the array
{
    for (int k = i; k < numItems; k++) //shift the array values from point i
    {
                double temp = 0.0;
        temp = items[k];
        items[k+1] = temp;
    }

    items[i] = value; //and insert value into i
}
if(i

它必须是递归方法吗?

一个简单的选择是反向迭代数组

for(int k=numItems;k>i;k--){
项目[k]=项目[k-1];
}
选项2:

如果您想保持方法的完整性,那么也可以使用不同的temp变量

在for循环将temp初始化为之前

然后在循环中,您可以使用temp将[k+1]值存储在temp中,而不是存储[k]值。


此外,还应注意边界,以便k+1不会超过数组中的最后一个元素。您可以使用类似numItems-1的东西并在前面进行检查,以确保数组不是空的。

您也可以使用memmove,它处理区域重叠

memmove(&items[k+1], &items[k], (numItems-k-1)*sizeof(double));
items[k] = value;

你能试试反转法吗

这是一个例子

// reverse array from start to end
void reverse(int a[], int start, int end)
{
  int i;
  int temp;
  while(start++ < end--)
  {
    temp = a[start];
    a[start] = a[end];
    a[end] = temp;
  }
}

// function that will rotate array by d elements
void rotateArray(int a[], int d, int n)
{
  reverse(a, 0, d-1);
  reverse(a, d, n-1);
  reverse(a, 0, n-1);
}
//从头到尾反转数组
无效反向(整数a[],整数开始,整数结束)
{
int i;
内部温度;
while(开始+++<结束--)
{
温度=一个[开始];
a[开始]=a[结束];
a[结束]=温度;
}
}
//将数组旋转d个元素的函数
void rotatarray(int a[],int d,int n)
{
反向(a,0,d-1);
反向(a、d、n-1);
反向(a,0,n-1);
}
#包括
#包括
#包括
#包括
int main(){
int i,j=0,s;
int n,k;
int A[n];
scanf(“%d%d”、&n和&k);
如果((n>=0)和&(n=0)){
对于(i=0;i=n){
k=k-n;
}否则{
对于(j=0;jn){
s-=n;
A[j]=A[s];
}否则{
A[j]=A[s];
}
}

对于(i=0;iOf当然,在
memmove
之后,您应该设置
items[0]=value;
您是对的,我还更正了答案以反映问题(插入第k个位置)。您可以在此处找到关于此问题的精彩讨论:
memmove(&items[k+1], &items[k], (numItems-k-1)*sizeof(double));
items[k] = value;
// reverse array from start to end
void reverse(int a[], int start, int end)
{
  int i;
  int temp;
  while(start++ < end--)
  {
    temp = a[start];
    a[start] = a[end];
    a[end] = temp;
  }
}

// function that will rotate array by d elements
void rotateArray(int a[], int d, int n)
{
  reverse(a, 0, d-1);
  reverse(a, d, n-1);
  reverse(a, 0, n-1);
}
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <stdlib.h>

int main() {

    int i,j=0,s;
    int n,k;
    int A[n];

    scanf("%d %d",&n,&k);
    if(((n>=0) && (n<=100000))&&(k>=0)){
        for(i=0;i<n;i++){
            scanf(" %d", &A[i]);
        }
        if(k>=n){
            k=k-n;
        }else{
        for(j=0;j<n;j++){
            s=j+k;
            if(s>n){
                s-=n;
                A[j]=A[s];
            }else{
            A[j]=A[s];
            }

        }
        for(i=0;i<n;i++){
            printf("%d ",A[i]);
        }
      }
    }
    return 0;
}