三维数组

一个三维数组a[i][j][k],数据元素为i*j*k个,在存储空间中顺序连续存储的,我们可以通过数组首地址,通过位移量来访问每一个元素。

假设三维数组每一维的最大长度为n,m,o;

在二维数数组中,我们访问元素是a[i][j]的地址=a[0][0]的地址+i*第一维的长度+j

同理在三维数组中我们可以把二维数组看成一个整体也就是a[i][j,k],这样访问就是

a[i][j,k]的地址=a[0][0,0]的地址+i*第二维和第一维的长度+a[j,k],而a[j,k]的地址就是

二维数组的地址,即a[i][j][k]地址=a[0][0][0]的地址+i*m*o+j*o+k;

同理n维就有了公式:

a[i][j][k]的地址=a[0][0]....[0]的地址+(b2*b3*....bn)*j1+(b3*b4...bn)*j2+...bn*jn-1+jn

用ci-1表示bi*cn-1;


#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;
typedef int datatype;
typedef struct
{
    datatype *base;//作为三维数组首地址
    int index[3]; //记录每一维 的长度
    int c[3]; //记录维数前面几维一行的数目,如c[0]记录第一维第二维一行的总数
}arr;
int  init_arry(arr *A,int b1,int b2,int b3)   //初始化数组
{

    if(b1<=0||b2<=0||b3<=0)
    {
         cout<<"error!"<<endl;
         return 0;
    }
    int  sum = b1*b2*b3;
     A->base = (datatype*)malloc(sizeof(sum*sizeof(datatype)));
     if(A->base==NULL)  return 0;
     A->index[0]=b1,A->index[1]=b2,A->index[2]=b3;
    A->c[0]=b2*b3,A->c[1]=b3,A->c[2]=1;
    return 1;
}
int value(arr *A,int i1,int i2,int i3,datatype *x)  //三维数组中查询某一值
{
    int id;
    if(i1<0||i1>=A->index[0]||i2<0||i2>=A->index[1]||i3<0||i3>=A->index[2])
    {
        cout<<"error!"<<endl;
        return 0;
    }
    id=A->c[0]*i1+A->c[1]*i2+A->c[2]*i3;
    *x=*(A->base+id);
    return 1;
}
int assig(arr *A,int i1,int i2,int i3,datatype x)  //改变某一值
{
    int id;
    if(i1<0||i1>=A->index[0]||i2<0||i2>=A->index[1]||i3<0||i3>=A->index[2])
    {
        cout<<"error!"<<endl;
        return 0;
    }
    id=A->c[0]*i1+A->c[1]*i2+i3*A->c[2];
    *(A->base+id) = x;
    return 1;
}
void Scanf(arr *A)
{
     int len  = A->index[0]*A->index[1]*A->index[2];
     for(int i=0;i<len;i++)
         *(A->base+i) = i;
        // scanf("%d",A->base+i);
}
void Printf(arr *A)
{
    int len =A->index[0]*A->index[1]*A->index[2];
    for(int i=0;i<len;i++)
       cout<<*(A->base+i) <<endl;
}
int main()
{
      int n,m,k;
      int i1,i2,i3,x;
      arr A;
      cout<<"输入三维数组每一维的大小:";
     cin>>n>>m>>k;
     int judge= init_arry(&A,n,m,k);
     if(judge) cout<<"success"<<endl;
     else
     {
           cout<<"fail"<<endl;
           return 0;
     }
     Scanf(&A);
     cout<<"输入要访问位置的坐标:"<<endl;
     cin>>i1>>i2>>i3;
     judge  = value(&A,i1,i2,i3,&x);
     cout<<"坐标在(i1,i2,i3)的值为"<<x<<endl;
     x=100000;
     assig(&A,i1,i2,i3,x);
     Printf(&A);

}


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值