Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/69.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中数组的每n个元素_C_Arrays - Fatal编程技术网

删除C中数组的每n个元素

删除C中数组的每n个元素,c,arrays,C,Arrays,如何删除数组的每个第n个元素? 对于exp:i有和数组a[]={2,12,4,5,67,33,24,45,6,1}; 我想删除第三个元素,这样得到的数组是[]={2,12,5,67,24,45,1}; 我知道如何在一个位置删除一个元素,但我找不到一种方法来删除每三个位置的元素。 所以我试过这样的方法: 我不需要任何特殊的方法来实现这一点,它可以在同一个数组中,也可以在新的数组中。不,我不会为您编写代码,但肯定可以在一些指针方面帮助您 首先,如果您试图修改相同的数组,这将是一项艰巨的任务。在每次删

如何删除数组的每个第n个元素? 对于exp:i有和数组a[]={2,12,4,5,67,33,24,45,6,1}; 我想删除第三个元素,这样得到的数组是[]={2,12,5,67,24,45,1}; 我知道如何在一个位置删除一个元素,但我找不到一种方法来删除每三个位置的元素。 所以我试过这样的方法:


我不需要任何特殊的方法来实现这一点,它可以在同一个数组中,也可以在新的数组中。

不,我不会为您编写代码,但肯定可以在一些指针方面帮助您

首先,如果您试图修改相同的数组,这将是一项艰巨的任务。在每次删除值(而不是元素本身)之后,要学究式地删除,您需要移动所有剩余的元素。相反,我建议

创建另一个数组。 使用循环,开始从源数组逐元素复制元素。 检查每个第n个索引的出现情况,跳过存储该索引值。 完成后,您将获得修改后的数组。 TL;博士,你需要一个循环来完成你的工作

[原始答案结束]

编辑:

您的代码片段错误的原因有很多,例如

是指向双精度的指针,类似于语句

a = (double*)malloc(100*sizeof(n));
这是错误的,因为 1.1. sizeofn为您提供SizeOfFint,但实际上它应该是sizeofdouble 1.2. C中malloc和family的返回值

它应该写为

a = malloc(100*sizeof*a);
向用户询问大小并输入固定大小的变量是非常危险的。如果用户输入的大小大于分配的大小,您的程序将崩溃

对嵌套循环使用相同的标识符可能是错误的,就像您的情况一样

最后,IMHO只在编译时分配大小未知时使用动态内存。如果要像上面代码中那样以固定方式分配动态内存,则实际上没有任何用处。

这是一种方法:

  for (
      int i = 0, j = 0; 
      i + j + 1 < sizeof(a) / sizeof(a[0]); 
      j += (i + j) % 3 ? 0 : 1, a[i] = a[i + j], ++i
   );
它在一次遍历中完成,并且不调整数组的结尾。由于第0个元素总是被删除,因此i+j+1是一个良好的停止条件

sizeofa/sizeofa[0]提供至少包含一个元素的数组中的元素数


迭代表达式定义得很好,因为它是从左到右排序和求值的。

这里有一个演示程序,演示了如何编写相应的函数

#include <stdio.h>

size_t remove_nth( int *a, size_t size, size_t n )
{
    int *p = a;

    if ( n != 0 )
    {
        size_t i = 0;

        while ( i < size && ( i + 1 ) % n != 0 ) i++;

        p = a + i;

        for ( ; i < size; i++ )
        {
            if ( ( i + 1 ) % n != 0 ) *p++ = a[i]; 
        }
    }

    return n == 0 ? size : p - a;
}

int main( void ) 
{
    int a[] = { 2, 12, 4, 5, 67, 33, 24, 45, 6, 1 }; 

    size_t n = remove_nth( a , sizeof( a ) / sizeof( *a ), 3 );

    for ( size_t i = 0; i < n; i++ ) printf( "%d ", a[i] );
    printf( "\n" );
}
首先,你的malloc声明是错误的。换成

a = (double *) malloc(n * sizeof(double));
现在只需构造一个新数组

b = (double *) malloc(n * sizeof(double));
j = 0;
for (i = 0; i < n; ++i)
    if ((i + 1) % 3 != 0)
        b[j++] = a[i];

循环结束后,j将具有数组b的长度。

我相信可以从一端遍历数组,让我们假设索引0是一致的

将计数器初始化为1,但让它引用数组的索引0,这样就不必除以0

循环遍历数组并 ifindex+1%3==0删除该索引

在循环的每次迭代中,如果索引不是第三位的元素,则将index-1设置为index,我假设您的意思是3的倍数。i、 E3,6,9,12

如果它是数组的最后一个元素,则将其设置为NULL,这样就不会在数组末尾有重复的元素


这样,您就不必创建额外的数组,也可以删除每三个元素。

请向我们展示您的代码:-分享您的研究成果对每个人都有帮助。告诉我们您尝试了什么,以及为什么它不能满足您的需求。这表明你花了时间来帮助自己,它使我们避免重复显而易见的答案,最重要的是,它帮助你得到一个更具体和相关的答案!另请参见欢迎使用堆栈溢出。请告诉我们你到目前为止都做了些什么。您可能还想提及,如果需要就地执行此操作,或者如果可以接受复制到新数组,则不能删除数组元素,可以将其替换为另一个值,使数组的最后一个元素保持未使用状态。或者你可以创建所需大小的新数组。@moffeltje在那里,我编辑了我的帖子:@Bathsheba先生,到底是怎么回事?你指的是交换吗?@SouravGhosh我有一个问题,因为数组以0开头,我尝试执行一个if语句,比如if counter除以3等于0,但是如果我从0开始,那么除以3的计数器位于第4位,为什么向下投票?这种方法虽然不如我的好,但已经足够了。@Bathsheba我也不明白其中的逻辑。如果有人发现任何错误,谢谢,但请让我知道,我或任何人,因为我不是一个读心术的人-
a = (double *) malloc(n * sizeof(double));
b = (double *) malloc(n * sizeof(double));
j = 0;
for (i = 0; i < n; ++i)
    if ((i + 1) % 3 != 0)
        b[j++] = a[i];