三维数组的搜索、访问、插入、删除

三维数组的搜索、访问、插入、删除

(三维数组转换为一维数组进行插入、删除和二分搜索)
代码如下:

#include<stdio.h>
#define z 2//宏定义数组z轴方向存储元素的最多个数
#define y 2//宏定义数组y轴方向存储元素的最多个数
#define x 3//宏定义数组x轴方向存储元素的最多个数
void display(int a[z][y][x])//显示数组存储元素
{
	int i,j,k;
	printf("The 3D array is:\n");
	for(i=0;i<z;i++)
	{
		for(j=0;j<y;j++)
		{
			for(k=0;k<x;k++)
			{
				printf("a[%d][%d][%d]=%d  ",i,j,k,a[i][j][k]);
			}
			printf("\n");//以每行x个元素的格式输出
		}
	}
}
void print(int b[100])//输出一维数组
{
	int m,n;
	printf("The 1D array is:\n");
	for(m=0,n=1;m<z*y*x;m++,n++)
	{
		printf("b[%d]=%d  ",m,b[m]);
		if(n%3==0)
		{
			printf("\n");//以每行3个元素的格式输出
		}
	}
}
void trbo(int a[z][y][x],int b[100])//三维数组转换为一维数组
{
	int i,j,k,m,n;
	for(i=0;i<z;i++)
	{
		for(j=0;j<y;j++)
		{
			for(k=0;k<x;k++)
			{
				b[x*y*i+x*j+k]=a[i][j][k];//三维数组与一维数组元素位置序号关系->x*y*i+x*j+k
			}
		}
	}
}
void insert(int a[z][y][x],int b[100])//插入数组元素
{
	int i,j,k,posz,posy,posx,p,num,q;
	trbo(a,b);//三维数组转一维数组
	printf("enter posz:");
	scanf("%d",&posz);//输入插入数组元素z轴方向的位置序号
	printf("enter posy:");
	scanf("%d",&posy);//输入插入数组元素y轴方向的位置序号
	printf("enter posx:");
	scanf("%d",&posx);//输入插入数组元素x轴方向的位置序号
	printf("enter num:");
	scanf("%d",&num);//输入需插入的数组元素
	for(p=x*y*z-1;p>=x*y*posz+x*posy+posx;p--)
	{
		b[p+1]=b[p];//插入元素位置及其后的元素后移一个位置
	}
	b[x*y*posz+x*posy+posx]=num;
	q=z+1;
	for(i=0;i<q;i++)
	{
		for(j=0;j<y;j++)
		{	
			for(k=0;k<x;k++)
			{
				printf("a[%d][%d][%d]=%d  ",i,j,k,b[x*y*i+x*j+k]);
				if(i==q-1&&j==0&&k==0)
				{
					break;//跳出内层循环
				}
			}
			printf("\n");//以每行x个元素的格式输出
			if(i==q-1&&j==0&&k==0)
			{
				break;//跳出中层循环
			}
		}
		if(i==q-1&&j==0&&k==0)
		{
			break;//跳出外层循环
		}
	}
}
void deleted(int a[z][y][x],int b[100])//删除数组元素
{
	int i,j,k,posz,posy,posx,p;
	trbo(a,b);//三维数组转一维数组
	printf("enter posz:");
	scanf("%d",&posz);//输入删除数组元素z轴方向的位置序号
	printf("enter posy:");
	scanf("%d",&posy);//输入删除数组元素y轴方向的位置序号
	printf("enter posx:");
	scanf("%d",&posx);//输入删除数组元素x轴方向的位置序号
	for(p=x*y*posz+x*posy+posx;p<x*y*z-1;p++)
	{
		b[p]=b[p+1];//删除元素位置及其后的元素前移一个位置
	}
	for(i=0;i<z;i++)
	{
		for(j=0;j<y;j++)
		{
			for(k=0;k<x;k++)
			{
				if(i==z-1&&j==y-1&&k==x-1)
				{
					break;//跳出内层循环
				}
				printf("a[%d][%d][%d]=%d  ",i,j,k,b[x*y*i+x*j+k]);
			}
			printf("\n");//以每行x个元素的格式输出
			if(i==z-1&&j==y-1&&k==x-1)
			{
				break;//跳出中层循环
			}
		}
		if(i==z-1&&j==y-1&&k==x-1)
		{
			break;//跳出外层循环
		}
	}
}
void xsearch(int a[z][y][x])//三维数组的线性搜索
{
	int i,j,k,search,n=0,p=0;
	printf("enter search:");
	scanf("%d",&search);//输入需查找的数组元素
	for(i=0;i<z;i++)
	{
		for(j=0;j<y;j++)
		{
			for(k=0;k<x;k++)
			{
				if(a[i][j][k]==search)//判断数组元素是否与查找元素相等
				{
					n=1;//中间介质
					p=x*y*i+x*j+k+1;
				}
			}
		}
	}
	if(n==1)//判断是否搜索到查找元素
	{
		printf("%d 是数组中第%d个元素\n",search,p);
	}
	else
	{
		printf("%d 不是数组中的元素\n",search);
	}
}
void efsearch(int a[z][y][x],int b[100])//三维数组的二分搜索
{
	int i,j,k,p,search,first,last,middle;
	trbo(a,b);//三维数组转一维数组
	printf("enter search:");
	scanf("%d",&search);//输入需查找的数组元素
	first=0;//初始化数组元素位置序号
	last=x*y*z-1;
	middle=(first+last)/2;
	while(first<=last)
	{
		if(search>b[middle])//判断数组元素是否与查找元素相等
		{
			first=middle+1;
		}
		else if(search==b[middle])
		{
			printf("%d 是数组中第%d个元素\n",search,middle+1);
			break;//跳出循环
		}
		else
		{
			last=middle-1;
		}
		middle=(first+last)/2;//搜索数组元素的数量减半
	}
	if(first>last)//判断是否搜索到查找元素
	{
		printf("%d 不是数组中的元素\n",search);
	}
}
void main()
{
	int i,j,k,d,a[z][y][x],b[100];
	printf("enter %d elements:\n",z*y*x);
	for(i=0;i<z;i++)
	{
		for(j=0;j<y;j++)
		{
			for(k=0;k<x;k++)
			{
				scanf("%d",&a[i][j][k]);//输入数组存储元素
			}
		}
	}
	printf("0.退出\n");
	printf("1.三维数组的访问\n");
	printf("2.三维数组转换为一维数组\n");
	printf("3.三维数组的插入\n");
	printf("4.三维数组的删除\n");
	printf("5.三维数组的线性搜索\n");
	printf("6.三维数组的二分搜索\n");
	while(1)//循环选择菜单
	{
		printf("*************************\n");
		printf("enter number:");
		scanf("%d",&d);//输入选择序号
		switch(d)
		{
			case 1:display(a);break;
			case 2:display(a);trbo(a,b);print(b);break;
			case 3:insert(a,b);break;
			case 4:deleted(a,b);break;	
			case 5:xsearch(a);break;
			case 6:efsearch(a,b);break;
			case 0:goto tiaochu;
		}
		if(d==0)//判断退出条件
		{
			tiaochu:break;//跳出循环
		}
	}
}

运行结果如下:
在这里插入图片描述
在这里插入图片描述

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值