动态数组

#include <stdio.h>
#include <stdarg.h>
#include <stdlib.h>
#define MAX_ARRAY_DIM 8
#define OK 1
#define ERROR 0
typedef int ElemType ;
typedef struct
{
  ElemType * base;
  int dim;
  int *bounds;
  int *constants;/*数组映像函数常数基址*/
}Array;
int initArray(Array *A,int dim,...);
int DestroyArray(Array *A);
int Value(Array A,ElemType *e,...);
int Assign(Array *A,ElemType e,...);
int initArray(Array *A,int dim,...)
{
va_list ap;
int i,l;
if(dim<1 || dim >MAX_ARRAY_DIM) return ERROR; //维数超出范围
A->dim=dim;
A->bounds=(int *)malloc(sizeof(int)*dim);
if(!A->bounds) exit(0);
va_start(ap,dim);
for(l=1,i=0;i<dim;i++) //记录每一个维度的大小
{
  A->bounds=va_arg(ap,int);
  l*=A->bounds;
}
va_end(ap);
A->base=(ElemType *)malloc(sizeof(ElemType)*l);
if(!A->base) exit(0);
A->constants=(int *)malloc(sizeof(int)*dim);
A->constants[dim-1]=1;
if(!A->constants) exit(0);
for(i=dim-2;i>=0;i--)
{
  A->constants=A->bounds*A->constants;
}
return OK;
}
int DestroyArray(Array *A)
{
if(A->base) free(A->base);
if(A->bounds) free(A->bounds);
if(A->constants) free(A->constants);
return OK;
}
int Value(Array A,ElemType *e,...)
{
int i,l,j;
va_list ap;
va_start(ap,e);
for(l=i=0;i<A.dim;i++)
{
  j=va_arg(ap,int);
  if(j<0 || j>=A.bounds) return ERROR;
  l+=A.constants*j;
}
va_end(ap);
*e=A.base[l];
return OK;
}
int Assign(Array *A,ElemType e,...)
{
int i,l,j;
va_list ap;
va_start(ap,e);
for(l=i=0;i<A->dim;i++)
{
  j=va_arg(ap,int);
  //printf("%d %d/n",j,A->bounds);
  if(j<0 || j>=A->bounds) return ERROR;
  l+=A->constants*j;
}
va_end(ap);
A->base[l]=e;
return OK;
}
int main(int argc, char *argv[])
{
int i,j,k,v;
Array A;
initArray(&A,3,2,3,4);
for(i=0;i<2;i++)
{
  for(j=0;j<3;j++)
  {
   for(k=0;k<4;k++)
    if(Assign(&A,i*3*4+j*4+k,i,j,k)<=0)
      printf("Error/n");
  }
}
for(i=0;i<2;i++)
{
  for(j=0;j<3;j++)
  {
   for(k=0;k<4;k++)
   {
    Value(A,&v,i,j,k);
    printf("%d ",v);
   }
   printf("/n");
  }
  printf("/n");
}
DestroyArray(&A);
return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值