我是靠谱客的博主 安详人生,最近开发中收集的这篇文章主要介绍数组的顺序表示和实现【严蔚敏】,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

代码为数据结构【严蔚敏】书籍配套纯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

最后

以上就是安详人生为你收集整理的数组的顺序表示和实现【严蔚敏】的全部内容,希望文章能够帮你解决数组的顺序表示和实现【严蔚敏】所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(33)

评论列表共有 0 条评论

立即
投稿
返回
顶部