删除C

时间:2015-07-02 12:15:46

标签: c arrays

如何删除数组的每个第n个元素?
对于exp:我有和数组a[]={2,12,4,5,67,33,24,45,6,1};
我想删除每个第3个元素,以便结果数组为a[]={2,12,5,67,24,45,1};
我知道如何在一个地方删除一个元素,但我找不到在每个第三个地方删除元素的方法。
所以我尝试过这样的事情:

int n,i;
double *a;  
printf("Enter number of elements: ");
scanf_s("%d",&n);

a = (double*)malloc(100*sizeof(n));
printf("Enter the elements: ");
for( i=0;i<n;i++) {
    scanf_s("%d",&a[i]);

}

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

}

for(i=0;i<n;i++){
    for ( i = 3 - 1 ; i < n - 1 ; i++ ){
         a[i] = a[i+1];
    }
}

  printf("\nResultant array is\n");

  for( i = 0 ; i < n - 1 ; i++ )
     printf("%d\n", a[i]);

并且我没有任何特殊的方式需要这样做,它可以在同一个数组或新数组中。

5 个答案:

答案 0 :(得分:4)

不,我不会为你编写代码,但肯定可以帮助你使用一些指针

首先,如果你尝试修改同一个数组,那将是一项艰巨的任务。每次删除(值,而不是元素本身,是迂腐的)之后,你需要转移每个剩余的元素。相反,我建议,

  1. 创建另一个数组。
  2. 使用循环,开始逐个元素地从源数组中复制。
  3. 检查每个n索引的出现次数,跳过存储该索引值。
  4. 完成后,您将获得修改过的数组。
  5. TL; DR 您需要一个循环才能完成工作。

    [原答案结束]

    编辑:

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

    1. a是指向double的指针,声明如

      a = (double*)malloc(100*sizeof(n));
      

      错了,因为
      1.1。 sizeof(n) sizeof(int)为你sizeof(double)但你应该malloc() 1.2。 see why not to cast Ca = malloc(100*sizeof*a); 和家人的返回值。

      应该写成

      Scalar_
    2. 向用户询问 size 并在固定大小变量中输入是非常危险的。如果用户输入的大小超过分配的大小,您的程序将会爆炸。

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

    4. 最后,恕我直言,只有在编译时不知道分配大小时才使用动态内存。如果您要以固定的方式分配动态内存(如上面的代码中所示),那么它实际上是没有用的。

答案 1 :(得分:1)

这是一种方式:

  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是一个很好的停止条件。

sizeof(a) / sizeof(a[0])为您提供至少包含一个元素的数组中的元素数。

迭代表达式定义明确,因为,按顺序排序并从左到右进行评估。

答案 2 :(得分: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" );
}

程序输出

2 12 5 67 24 45 1 

答案 3 :(得分:0)

首先,您的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的长度。

答案 4 :(得分:0)

我相信你可以从一端遍历数组(让我们说索引0是一致的)。

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

  2. 循环遍历数组和 if((index + 1) % 3 == 0)删除该索引

  3. 在循环的每次迭代中,如果索引不是第3位的元素,则将(index - 1)设置为索引(我假设您的平均值是3的倍数,即3,6 ,9,12 ...)

  4. 如果它是数组的最后一个元素,请将其设置为NULL,这样就不会在数组末尾出现重复。

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