数组和广义表

数组的顺序表示和实现

//---数组的顺序存储表示和实现----
#include<stdarg.h>  //标准头文件,提供宏va_start,va_arg,和va_end,
                    //用于存取变长参数表
#define MAX_ARRAY_DIM 8  //假设数组维数的最大值为8
typedef struct{
     ElemType  *base;    //数组元素基址,由/InitArray分配
     int   dim;   //数组维数
     int   *bounds;  //数组维界基址,由InitArray分配
     int   *constants;  //数组映射函数常量基址,由InitArray分配
     }Array;
//---基本操作的函数原型说明------
Status InitArray(Array &A,int dim,...);
//若维数dim和随后的各维长度合法,则构造相应的数组A,并返回OK。
Status DestroyArray(Array &A);
//销毁数组A。
Status Value(Array A,ElemType &e,...);
//A是n维数组,e为元素变量,随后是n个下标值。
//若各下标不超界,则e赋值为所指定的A的元素值,并返回OK 
Status Assign(Array &A,ElemType e,...);
//A是n维数组,e为元素变量,随后是n个下标值
//若下表不超界,则将e的值赋给所指定的A的元素,并返回OK
//--基本操作的算法描述---
Status InitArray(Array &A,int dim,...){
//若维数dim和各维长度合法,则构造相应的数组A,并返回OK
    if(dim<1||dim>MAX_ARRAY_DIM)  return ERROR;
    A.dim=dim;
    A.bounds=(int *)malloc(dim * sizeof(int));
    if(!A.bounds)  exit(OVERFLOW);
    //若各维长度合法,则存入A.bounds,并求出A的元素总数elemtotal
    elemtotal=1;
    va_start(ap,dim);  //ap为va_list类型,是存放变长参数表信息的数组
    for(i=0;i<dim;++i){
       A.bounds[i]=va_arg(ap,int);
       if(A.bounds[i]<0)return UNDERFLOW;
       elemtotal *=A.bounds[i];
       }
       va_end(ap);
       A.base=(ElemType *)malloc(elemtotal * sizeof(ElemType));
       if(!A.base)exit(OVERFLOW);
       //求映像函数的常数ci,并存入A。constants[i-1],i=a,...,dim
       A.constants=(int *)malloc(dim * sizeof(int));
       if(!A.constants)exit(OVERFLOW);
       A.constants[dim-1]=1;  //L=1,指针的增减以元素的大小为单位
       for(i=dim-2;i>=0;--i)
          A.constants[i]=A.bounds[i+i]*A.constants[i+1];
       return OK;
       }
Status DestroyArray(Array &A){
//销毁数组A。
      if(!A.base)return ERROR;
      free(A.base);  A.base=NULL;
      if(!A.bounds)return return ERROR;
      free(A.bounds);A.bounds=NULL;
      if(!A.constsnts) return ERROR;
      free(A.constants); A,constants=NULL;
      return OK;
      }
Status Locate(Array A,va_list ap,int &off){
//若ap指示的各下标值合法,则求出该元素在A中相对地址off
    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(Array A,ElemType &e,...){
//A是n维数组,e为元素变量,随后是n个下标值。
//若各下标不超界,则e赋值为所指定的A的元素值,并返回OK。
     va_start(ap,e);
     if((result=Locate(A,ap,off))<=0)return result;
     e=*(A.base+off);
     return OK;
}
Status Assign(Array &A,ElemType e,...){
//A事n维数组,e为元素变量,随后是n个下标值。
//箬下标不超界,则将e的值赋格所指定的A的元素,并返回OK。
     va_start(ap,e);
     if((result=Locate(A,ap,off))<=0)return result;
     *(A.base+off)=e;
     return OK;
     }


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值