已知一个二维整型数组已初始化a[5][5]={ {1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7},{0,1,2,3,4},{6,7,8,9,0}},请删除此数组中所有等于指定值的元素,删除后,各元素依次前移。
请注意,C语言二维数组的行优先方式存储。例如:a[3][2]的数组,在内存中依次存储a[0][0],a[0][1],a[1][0],a[1][1],a[2][0],a[2][1],也就是说,先存储第“0”行的元素,再存储第“1”行的元素。
输入:一行一个整数,表示被删除的元素。
输出:若干行,每行若干个整数。(每个数占3列,每输出5个数以后换行)
运行效果如下,请完成程序中空缺代码(不允许新增变量定义和修改已有语句)。
#include <stdio.h>
int main(){
int i,j,count=0,num;
int a[5][5]={ {1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7},{0,1,2,3,4},{6,7,8,9,0}};
scanf(“%d”,&num);
for(i=0;i<5;i++)
for(j=0;j<5;j++)
if(a[i][j]!=num){
【1】//请填入一行或多行代码
}
for(i=0;i<5;i++){//输出
【2】//请填入一行或多行代码
printf(“\n”);
}
return 0;
}
#include <stdio.h>
int main(){
int i,j,count=0,num;
int a[5][5]={
{1,2,3,4,5},{2,3,4,5,6},{3,4,5,6,7},{0,1,2,3,4},{6,7,8,9,0}};
scanf("%d",&num);
for(i=0;i<5;i++)
for(j=0;j<5;j++)
if(a[i][j]!=num){
*(a[0]+count)=a[i][j];
count++;
}
for(i=0;i<5;i++){//输出
for(j=0;j<5;j++)
{
if(i*5+j<count)
{
printf("%3d",a[i][j]);
}
}
printf("\n");
}
return 0;
}
以上是我编写的代码;
我们如果要从二维数组中删除元素,题目已经给了提示了,二维数组的存储其实也是连续的,我们可以用*(*(a+i)+j)来表示a[i][j],因为a其实是数组首元素的地址,即a=&a[0],对他加个i实际上就对应着每一行的首元素地址,*(*(a+i)+j)=*(a[i]+j),剩下的就很简单了,我们设置的是count计数,如果不是选定要删除的数字,我们就把他保存在原数组中,如果是要删除的数字,count是不会移动的,等j移动到符合的元素再停止。
在第二部分输出中,因为count计数其实他就是我们符合题设条件的数字总数,而i*5是代表一行有多少个元素,加上列的最终要少于count,因为后面的就没必要输出了。