多维数组的实现

来源:互联网 发布:手机倒计时软件下载 编辑:程序博客网 时间:2024/05/29 04:52

#define MAX_ARRAY_DIM 8
#define ElemType int

//数组的定义
typedef struct {

 ElemType *base;
 int dim;
 int *bounds;
 int *constants;

} Array;

//初始化数组,dim后面是可变参数部分
int InitArray(Array &A,int dim,...)
{

 if(dim<1 || dim>MAX_ARRAY_DIM) return -1;
 A.dim=dim;
 A.bounds=(int *)malloc(dim*sizeof(int));
 if(!A.bounds)  return -1;
 int elemtotal=1;
 va_list ap;
 va_start(ap,dim);
 for(int i=0;i<dim;i++)
 {
    A.bounds[i]=va_arg(ap,int);
    if(A.bounds[i]<0)  return -1;
    elemtotal*=A.bounds[i];//计算数组总大小
 }
 va_end(ap);
 A.base=(ElemType *)malloc(elemtotal*sizeof(ElemType));
 A.constants=(int *)malloc(dim *sizeof(int));
 A.constants[i-1]=1;
 for(i=dim-2;i>=0;i--)
  A.constants[i]=A.bounds[i+1]*A.constants[i+1];//计算c值
 return 1;

 
}

//定位
int Locate(Array A,va_list ap,int &off)
{
   off=0;
   for(int i=0;i<A.dim;++i)
   {
      int ind=va_arg(ap,int);
   if(ind <0 || ind>=A.bounds[i])  return -1;
   off+=A.constants[i]*ind;
   }
   return 1;
}

//给数组赋值
int Assign(Array &A,ElemType e,...)
{
  va_list ap;
  va_start(ap,e);
  int off,result;
  if((result=Locate(A,ap,off))<=0)  return result;
  *(A.base+off)=e;
  return 1;
}
void main()
{
  Array A;
  int e;
  InitArray(A,3,5,6,7);
  Assign(A,100,1,2,3);
  Value(A,e,1,2,3)
  printf("/nA[1,2,3]=%d",e);

}