⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 bo5-1.cpp

📁 配合严蔚敏的数据结构的辅导书
💻 CPP
字号:
 // bo5-1.cpp 顺序存储数组(存储结构由c5-1.h定义)的基本操作(5个)
 Status InitArray(Array &A,int dim,...)
 { // 若维数dim和各维长度合法,则构造相应的数组A,并返回OK。在教科书第93页
   int elemtotal=1,i; // elemtotal是数组元素总数,初值为1(累乘器)
   va_list ap; // 变长参数表类型,在stdarg.h中
   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); // 变长参数“...”从形参dim之后开始
   for(i=0;i<dim;++i)
   { A.bounds[i]=va_arg(ap,int); // 逐一将变长参数赋给A.bounds[i]
     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; // 最后一维的偏移量为1
   for(i=dim-2;i>=0;--i)
     A.constants[i]=A.bounds[i+1]*A.constants[i+1]; // 每一维的偏移量
    return OK;
 }

 void DestroyArray(Array &A)
 { // 销毁数组A。在教科书第94页
   if(A.base) // A.base指向存储单元
     free(A.base); // 释放A.base所指向的存储单元
   if(A.bounds)
     free(A.bounds);
   if(A.constants)
     free(A.constants);
   A.base= A.bounds=A.constants=NULL; // 使它们不再指向任何存储单元
   A.dim=0;
 }

 Status Locate(Array A,va_list ap,int &off) // Value()、Assign()调用此函数
 { // 若ap指示的各下标值合法,则求出该元素在A中的相对地址off。在教科书第94页
   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的相应的元素值。在教科书第94页
   va_list ap; // 变长参数表类型,在stdarg.h中
   int off;
   va_start(ap,A); // 变长参数“...”从形参A之后开始
   if(Locate(A,ap,off)==OVERFLOW) // 调用Locate(),求得变长参数所指单元的相对地址off
     return ERROR;
   e=*(A.base+off); // 将变长参数所指单元的值赋给e
   return OK;
 }

 Status Assign(Array A,ElemType e,...) // 变量A的值不变,故不需要&
 { // “...”依次为各维的下标值,若各下标合法,则将e的值赋给A的指定的元素。在教科书第95页
   va_list ap; // 变长参数表类型,在stdarg.h中
   int off;
   va_start(ap,e); // 变长参数“...”从形参e之后开始
   if(Locate(A,ap,off)==OVERFLOW) // 调用Locate(),求得变长参数所指单元的相对地址off
     return ERROR;
   *(A.base+off)=e; // 将e的值赋给变长参数所指单元
   return OK;
 }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -