如何在不制作数组副本的情况下从C数组中删除每一个值?

问题:我想得到一个数组A [6] = {6,5,4,3,2,1}为A [6] = {5,1,1}.换句话说 – “删除”每秒从0开始的第二个值,并将所有其他值向左移动.

我的尝试:

为此,我将使用此代码,其中a – 数组A的相关部分的长度(具有未删除元素的部分),ind – 我想要删除的值的索引.

for (int j = ind; j < n; j++)
    A[j] = A[j+1];

但是,使用这样的代码我无法使用它:

void deleting(int A[],int& a,int ind){
    for (int j = ind; j < a; j++)
        A[j] = A[j+1];

    a--;
}

int A[6] = {6,1};
a = 6

for (int i = 0; i < a; i+=2)
    deleting(A,a,i);

运行此代码后,我得到A [6] = {5,1507485184,1507485184}.因此,它删除了索引0,3处的元素.为什么删除第3个索引?

解决方法

有两种方法可以做到这一点:

>走完阵列,将最后的n-i个元素复制到每个偶数的一个位置,或者
>弄清楚最终的状态,然后直接去做.最终状态是第一个n / 2个位置是array [i] = array [2 * i 1],最后n / 2个位置只是最后一个元素的副本.

第一种方法是你要求的,但它做了多次冗余复制操作,第二种方法避免了.

至于你的实现问题,检查j = n-1时会发生什么,并记住A [n]不是数组的有效元素.我建议无论如何都要使copy-everything-forward操作成为自己的函数(或者你可以只使用memcpy)

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...