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

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


//数组的顺序存储表示
 #include // 标准头文件,提供宏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=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.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

你可能感兴趣的:(数据结构与算法)