数组的顺序表示和实现【严蔚敏】

代码为数据结构【严蔚敏】书籍配套纯c代码


//数组的顺序存储表示
 #include<stdarg.h> // 标准头文件,提供宏va_start,va_arg和va_end,
                    // 用于存取变长参数表
 struct Array
 {
   ElemType *base; // 数组元素基址,由InitArray分配
   int dim; // 数组维数
   int *bounds; // 数组维界基址,由InitArray分配
   int *constants; // 数组映象函数常量基址,由InitArray分配
 };


Status InitArray(Array &A,int dim,...)
{ // 若维数dim和各维长度合法,则构造相应的数组A,并返回OK(图5-2)
  int elemtotal=1,i; // elemtotal是元素总值
  va_list ap;
  if(dim<1||dim>MAX_ARRAY_DIM)
    return ERROR;
  A.dim=dim;
  A.bounds=(int *)malloc(dim*sizeof(int));
  if(!A.bounds)
    exit(OVERFLOW);
  va_start(ap,dim);
  for(i=0;i<dim;++i)
  {
    A.bounds[i]=va_arg(ap,int);
    if(A.bounds[i]<0)
      return UNDERFLOW; // 在math.h中定义为4
    elemtotal*=A.bounds[i];
  }
  va_end(ap);
  A.base=(ElemType *)malloc(elemtotal*sizeof(ElemType));
  if(!A.base)
    exit(OVERFLOW);
  A.constants=(int *)malloc(dim*sizeof(int));
  if(!A.constants)
    exit(OVERFLOW);
  A.constants[dim-1]=1;
  for(i=dim-2;i>=0;--i)
    A.constants[i]=A.bounds[i+1]*A.constants[i+1];
  return OK;
}

Status DestroyArray(Array &A)
{ // 销毁数组A(图5-3)
  if(A.base)
  {
    free(A.base);
    A.base=NULL;
  }
  else
    return ERROR;
  if(A.bounds)
  {
    free(A.bounds);
    A.bounds=NULL;
  }
  else
    return ERROR;
  if(A.constants)
  {
    free(A.constants);
    A.constants=NULL;
  }
  else
    return ERROR;
  return OK;
}

Status Locate(Array A,va_list ap,int &off) // Value()、Assign()调用此函数
{ // 若ap指示的各下标值合法,则求出该元素在A中的相对地址off
  int i,ind;
  off=0;
  for(i=0;i<A.dim;i++)
  {
    ind=va_arg(ap,int);
    if(ind<0||ind>=A.bounds[i])
      return OVERFLOW;
    off+=A.constants[i]*ind;
  }
  return OK;
}

Status Value(ElemType &e,Array A,...) // 在VC++中,...之前的形参不能是引用类型
{ // ...依次为各维的下标值,若各下标合法,则e被赋值为A的相应的元素值
  va_list ap;
  Status result;
  int off;
  va_start(ap,A);
  if((result=Locate(A,ap,off))==OVERFLOW) // 调用Locate()
    return result;
  e=*(A.base+off);
  return OK;
}

Status Assign(Array &A,ElemType e,...)
{ // ...依次为各维的下标值,若各下标合法,则将e的值赋给A的指定的元素
  va_list ap;
  Status result;
  int off;
  va_start(ap,e);
  if((result=Locate(A,ap,off))==OVERFLOW) // 调用Locate()
    return result;
  *(A.base+off)=e;
  return OK;
}
// stdarg.h描述详解http://blog.csdn.net/holandstone/article/details/6947119

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值