三维数组

来源:互联网 发布:bat程序员收入 编辑:程序博客网 时间:2024/04/27 22:59

一个三维数组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);}


0 0