回 帖 发 新 帖 刷新版面

主题:初始化数组的算法,有些地方不明白

严尉敏主编的《数据结构》第五章 数组和广义表
初始化数组的算法为:
有一些地方不明白,请指教:

// 数组的顺序存储表示
#include<stdarg.h> // 标准头文件,提供宏va_start,va_arg和va_end,
                    // 用于存取变长参数表
                   [color=FF0000] //ca_start,va_arg和ca_end都是用作干什么的[/color]#define MAX_ARRAY_DIM 8 // 假设数组维数的最大值为8
struct Array
{
   ElemType *base; // 数组元素基址,由InitArray分配
   int dim; // 数组维数
   int *bounds; // 数组维界基址,由InitArray分配 
   int *constants; // 数组映象函数常量基址,由InitArray分配 [color=FF0000]//此变量的作用是什么?[/color]};

Status InitArray(Array &A,int dim,...)  
{ // 若维数dim和各维长度合法,则构造相应的数组A,并返回OK
   int elemtotal=1,i; // elemtotal是数组元素总数,初值为1(累乘器)
   va_list ap;[color=FF0000]//va_list是什么类型[/color]
   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);//ap为va_list类型,是存放变长参数表信息的数组
[color=FF0000]//???这注释什么意思啊[/color]
   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);
[color=FF0000]//下面的就都并明白是什么意思,做什么用了[/color]
   //求映像函数的常数Ci,并存入A.constants[i-1],i=1,...,dim
   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;
}

回复列表 (共3个回复)

沙发

在stdarg.h有这样一句typedef char *  va_list;
va_start,va_arg和va_end是配合起来用的
va_start(ap,dim)这个中AP指向栈的指针(是可变参数的串,指向串的第一个参数),DIM是可变参数前的一个参数
va_arg(ap,int)第调用一次这个AP是,栈指针就下移,INT是返回的类型
VA_END(AP)释放AP,有点像FREE


量子最后面的代码是存储数组的地址,这样方便随机访问

板凳

还是不懂,能不能提供一下这个算法的C程序

3 楼

http://www.programfan.com/club/showtxt.asp?id=141694
参考下这

我来回复

您尚未登录,请登录后再回复。点此登录或注册