三维数组的搜索、访问、插入、删除
(三维数组转换为一维数组进行插入、删除和二分搜索)
代码如下:
#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;//跳出循环
}
}
}
运行结果如下: