在数组中移动元素

20

这很基础,但我找不到有效的答案。我知道我必须使用其他方式逐个移动数组值,但以下代码会使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
}

必须使用递归方法吗?

4个回答

39

你也可以使用memmove函数,它可以处理区域重叠。

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

当然,在 memmove 之后,你应该设置 items[0] = value; - Frerich Raabe
你是对的,我也已经更正了答案以反映问题(在第k个位置插入)。 - Teudimundo
2
你可以在这里找到一个关于这个问题的好讨论:https://dev59.com/JGsz5IYBdhLWcg3wmpP0 - Teudimundo

11

一个简单的选择是以相反的顺序迭代数组

for (int k = numItems; k > i; k--){        
    items[k]=items[k-1];
}

选项2:

如果你想保留你的方法不变,那么你也可以以不同的方式使用临时变量。

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

double temp = items[i];

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

items [k+1] = temp;
temp = items [k+1];
items[k+1] = items[k];

此外,您应该注意边界,以确保 k+1 不超过数组中的最后一个元素。您可以使用像 numItems - 1 这样的表达式,并在操作前检查以确保数组不为空。


0

你能试试反转方法吗?

这是一个例子。

// 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);
}

-2
#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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接