如何删除数组的每个第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]);
并且我没有任何特殊的方式需要这样做,它可以在同一个数组或新数组中。
答案 0 :(得分:4)
不,我不会为你编写代码,但肯定可以帮助你使用一些指针。
首先,如果你尝试修改同一个数组,那将是一项艰巨的任务。每次删除(值,而不是元素本身,是迂腐的)之后,你需要转移每个剩余的元素。相反,我建议,
n
索引的出现次数,跳过存储该索引值。TL; DR 您需要一个循环才能完成工作。
[原答案结束]
编辑:
您的代码段错误有很多原因,例如
a
是指向double
的指针,声明如
a = (double*)malloc(100*sizeof(n));
错了,因为
1.1。 sizeof(n)
sizeof(int)
为你sizeof(double)
但你应该malloc()
1.2。 see why not to cast C
中a = malloc(100*sizeof*a);
和家人的返回值。
应该写成
Scalar_
向用户询问 size 并在固定大小变量中输入是非常危险的。如果用户输入的大小超过分配的大小,您的程序将会爆炸。
对于嵌套循环使用相同的标识符可能是错误的,就像您的情况一样。
最后,恕我直言,只有在编译时不知道分配大小时才使用动态内存。如果您要以固定的方式分配动态内存(如上面的代码中所示),那么它实际上是没有用的。
答案 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,但让它引用数组的索引0(这样你就不必除以0)。
循环遍历数组和
if((index + 1) % 3 == 0)
删除该索引
在循环的每次迭代中,如果索引不是第3位的元素,则将(index - 1)设置为索引(我假设您的平均值是3的倍数,即3,6 ,9,12 ...)
如果它是数组的最后一个元素,请将其设置为NULL,这样就不会在数组末尾出现重复。
这样您就不必创建额外的数组,并且可以删除每个第三个元素。