#include<iostream>
#include<cstdarg>
using namespace std;
//--------------------数组的顺序存储表示--------------------
#define MAX_ARRAY_DIM 8
#define error -1
#define ok 1
typedef int ElemType;
typedef int Status;
typedef char* va_list;
typedef struct{
ElemType *base; //数组元素基址,由InitArray分配
int dim; //数组维数
int *bound; //数组维界基址,由InitArray分配
int *constants; //数组映像函数常量基址,由InitArray分配
}Array;
//-------------------基本操作的函数原型说明-------------------
class ArrayOperation{
public:
//若维数dim和随后的各维长度合法,则构造相应的数组A,并返回ok
Status InitArray(Array &A,int dim,...);
//销毁数组A
Status DesArray(Array &A);
//若ap指向的各下标值合法,则求出该元素在A中的相对地址off
Status Locate(Array A,va_list ap,int &off);
//A是n维数组,e为元素变量,随后是n个下标值
//若各下标不超界,则e赋值为所指定的A的元素之,并返回ok
Status Value(Array A,ElemType &e,int n,...);
//A是n维数组,e为元素变量,随后是n个下标值
//若各下标不超界,则将e的值赋给指定的A的元素,并返回ok
Status Assign(Array &A,ElemType e,int n,...);
};
//--------------------基本操作的函数实现-----------------------
Status ArrayOperation::InitArray(Array &A,int dim,...)
{
int elemtotal=1; //定义A的元素总数
va_list ap;
if(1>dim||MAX_ARRAY_DIM<dim)
return error;
A.dim=dim; //数组A的维数
A.bound=new int[dim];//分配数组维界的内存空间
if(!A.bound)
exit(-1);
//若各维长度合法,则存入A.bounds,并求出A的元素总和elemtotal
va_start(ap,dim); //ap是存放变长参数表信息的数组
for(int i=0;i<dim;i++)
{
A.bound[i]=va_arg(ap,int); // 确定各维长度
if(A.bound[i]<0)
return error;
elemtotal*=A.bound[i]; //矩阵A的元素总数
}//for
va_end(ap);
A.base=new ElemType[elemtotal];//分配矩阵A的内存空间
if(!A.base)
exit(-1);
//求映像函数的常数Ci,并存入A.constants[i-1],i=1,2,...dim
A.constants=new int[dim];
if(!A.constants)
exit(-1);
A.constants[dim-1]=1; //L=1,指针的增减以元素的大小为单位
for(int i=dim-2;i>=0;i--)
A.constants[i]=A.bound[i+1]*A.constants[i+1];
return ok;
}//InitArray
Status ArrayOperation::DesArray(Array &A)
{
if(!A.base||!A.bound||!A.constants)
return error;
delete A.base; A.base=NULL;
delete A.bound; A.bound=NULL;
delete A.constants; A.constants=NULL;
return ok;
}//DesArray
Status ArrayOperation::Locate(Array A,va_list ap,int &off)
{
int loc;
off=0;
for(int i=0;i<A.dim;i++)
{
loc=va_arg(ap,int);
if(loc<0||loc>=A.bound[i])//每一维的下标应小于该维的长度
return error;
off+=A.constants[i]*loc;
}//for
return ok;
}//Locate
Status ArrayOperation::Value(Array A,ElemType &e,int n,...)
{
va_list ap;
int off=0;
va_start(ap,n);
if(!Locate(A,ap,off))
return error;
e=*(A.base+off); //将合法的下标值赋给e
return ok;
}//Value
Status ArrayOperation::Assign(Array &A,ElemType e,int n,...)
{
va_list ap;
int off=0;
va_start(ap,n);
if(!Locate(A,ap,off))
return error;
*(A.base+off)=e;
return ok;
}//Assign
void main()
{
ArrayOperation AOP;
Array A;
int i,j;
ElemType e=0;
AOP.InitArray(A,2,2,2);
for(i=0;i<2;i++)
for(j=0;j<2;j++)
AOP.Assign(A,++e,2,i,j);
for(i=0;i<2;i++)
{
for(j=0;j<2;j++)
{
AOP.Value(A,e,2,i,j);
cout<<e<<" ";
}//for
cout<<endl;
}//for
}//main
数据结构中数组的顺序存储
最新推荐文章于 2023-04-29 21:21:02 发布