数组中的shift元素

Suk*_*woo 11 c arrays recursion copy

这是基本的,但我的谷歌搜索只是没有削减它.我知道我必须做一些其他事情来逐个移动数组的值,但是下面的编码给了我相同的项[k]到项目[infinity]的值,等于项目[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
}
Run Code Online (Sandbox Code Playgroud)

它必须是递归方法吗?

Teu*_*ndo 23

您也可以使用memmove来处理区域的重叠.

memmove(&items[k+1], &items[k], (numItems-k-1)*sizeof(double));
items[k] = value;
Run Code Online (Sandbox Code Playgroud)

  • 你可以在这里找到关于这个问题的一个很好的讨论:http://stackoverflow.com/questions/7776085/why-is-memcpy-and-memmove-faster-than-pointer-increments (2认同)

小智 7

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

for (int k = numItems; k > i; k--){        
    items[k]=items[k-1];
}
Run Code Online (Sandbox Code Playgroud)

选项2:

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

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

double temp = items[i];
Run Code Online (Sandbox Code Playgroud)

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

items [k+1] = temp;
temp = items [k+1];
items[k+1] = items[k];
Run Code Online (Sandbox Code Playgroud)

你也应该注意你的边界,这样k + 1就不会越过数组中的最后一个元素.你可以使用像numItems - 1之类的东西,之前检查,以确保数组不为空.