二维数组中指定元素的删除

已知一个二维整型数组已初始化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,因为后面的就没必要输出了。

    原文作者:PPG777
    原文地址: https://blog.csdn.net/weixin_55853990/article/details/117136084
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞