匠人老大,求助,关于一个数据结构的问题?

[复制链接]
3780|11
 楼主| 土憋ㄘ` 发表于 2010-11-3 08:18 | 显示全部楼层 |阅读模式
在自学数据结构,没有老师指点,身边也无可问之人,这有在这里发帖提问了,望大虾指点、、#define MaxArraySize 2typedef struct{    DataType *base;  /*数组元素的基地址*/    int dim;    /*数组的维数*/int *bounds;  /*数组的每一维之间的界限的地址*/int *constants;  /*数组存储映像常量基地址*/}Array;int InitArray(Array *A,int dim,...)/*数组的初始化操作*/{    int elemtotal=1,i;      /*elemtotal是数组元素总数,初值为1*/    va_list ap;    if(dim<1||dim>MaxArraySize)   /*如果维数不合法,返回0*/        return 0;    A->dim=dim;    A->bounds=(int *)malloc(dim*sizeof(int));  /*分配一个dim大小的内存单元*/    if(!A->bounds)        exit(-1);    va_start(ap,dim);      /*dim是一个固定参数,即可变参数的前一个参数*/    for(i=0;i<dim;++i)    {        A->bounds[i]=va_arg(ap,int);   /*依次取得可变参数,即各维的长度*/        if(A->bounds[i]<0)            return -1; // 在math.h中定义为4        elemtotal*=A->bounds[i];    /*得到数组中元素总的个数*/    }    va_end(ap);    A->base=(DataType *)malloc(elemtotal*sizeof(DataType)); /*为数组分配所有元素分配内存空间*/    if(!A->base)        exit(-1);    A->constants=(int *)malloc(dim*sizeof(int));  /*为数组的常量基址分配内存单元*/    if(!A->constants)        exit(-1);    A->constants[dim-1]=1;    for(i=dim-2;i>=0;--i)        A->constants[i]=A->bounds[i+1]*A->constants[i+1];    return 1;}int LocateArray(Array A,va_list ap,int *offset) /*根据数组中元素的下标,求出该元素在A中的相对地址offset*/{     int i,instand;    *offset=0;    for(i=0;i<A.dim;i++)    {        instand=va_arg(ap,int);        if(instand<0||instand>=A.bounds[i])            return 0;        *offset+=A.constants[i]*instand;    }    return 1;} 帮我看一下这段代码:数组中的这个参数A->constants是什么意思?有什么用?数组的定位操作时,是怎么利用A->constants这个参数得出数组元素的偏移地址offset的???望大虾解答、谢谢
 楼主| 土憋ㄘ` 发表于 2010-11-3 08:19 | 显示全部楼层
我晕、、格式全乱了、、
 楼主| 土憋ㄘ` 发表于 2010-11-3 08:22 | 显示全部楼层
 楼主| 土憋ㄘ` 发表于 2010-11-3 08:23 | 显示全部楼层
 楼主| 土憋ㄘ` 发表于 2010-11-3 08:23 | 显示全部楼层
帮我看一下这段代码:
数组中的这个参数A->constants是什么意思?有什么用?
数组的定位操作时,是怎么利用A->constants这个参数得出数组元素的偏移地址offset的???
望大虾解答、谢谢!
ayb_ice 发表于 2010-11-3 08:31 | 显示全部楼层
A是指向结构体的指针
显然A->constants指向结构体的成员
...
 楼主| 土憋ㄘ` 发表于 2010-11-3 08:42 | 显示全部楼层
具体点呢?
比如:
实参传入的是 A,3,2,5,7
dim=3;
bounds[]={2,5,7}
然后、
constants里的内容是什么?数组元素定位函数是怎么实现的、
 楼主| 土憋ㄘ` 发表于 2010-11-3 09:23 | 显示全部楼层
我擦呀、、我瞎了我的狗眼、、有句代码看错了、我说怎么看都看不懂?
MB滴、、仔细呀、、
又白白浪费这么多生命、、
focuson 发表于 2010-11-3 14:21 | 显示全部楼层
晕,发帖的时候不是有个 ‘代码’ (就是<>)嘛。。放在里面就不会乱。
zhiyonghe 发表于 2010-11-3 14:52 | 显示全部楼层
  1. #define MaxArraySize 2
  2. typedef struct
  3. {   
  4.     DataType *base;   /*数组元素的基地址*/   
  5.     int dim;          /*数组的维数*/
  6.     int *bounds;      /*数组的每一维之间的界限的地址*/
  7.     int *constants;   /*数组存储映像常量基地址*/
  8. }Array;
  9. int InitArray(Array *A,int dim,...)    /*数组的初始化操作*/
  10. {   
  11.     int elemtotal = 1,i;                /*elemtotal是数组元素总数,初值为1*/   
  12.     va_list ap;   
  13.     if(dim<1||dim>MaxArraySize)         /*如果维数不合法,返回0*/      
  14.     return 0;   
  15.     A->dim = dim;   
  16.     A->bounds = (int *)malloc(dim*sizeof(int));  /*分配一个dim大小的内存单元*/   
  17.     if(!A->bounds)      
  18.     exit(-1);   
  19.     va_start(ap,dim);                    /*dim是一个固定参数,即可变参数的前一个参数*/   
  20.     for(i=0;i<dim;++i)   
  21.     {      
  22.         A->bounds[i] = va_arg(ap,int);   /*依次取得可变参数,即各维的长度*/      
  23.         if(A->bounds[i]<0)           
  24.         return -1;                       // 在math.h中定义为4      
  25.         elemtotal *= A->bounds[i];       /*得到数组中元素总的个数*/   
  26.     }   
  27.     va_end(ap);  
  28.     A->base = (DataType *)malloc(elemtotal*sizeof(DataType)); /*为数组分配所有元素分配内存空间*/   
  29.     if(!A->base)      
  30.     exit(-1);   
  31.     A->constants = (int *)malloc(dim*sizeof(int));           /*为数组的常量基址分配内存单元*/  
  32.     if(!A->constants)     
  33.     exit(-1);   
  34.     A->constants[dim-1] = 1;  
  35.     for(i=dim-2;i>=0;--i)     
  36.     A->constants[i] = A->bounds[i+1]*A->constants[i+1];
  37.     return 1;
  38. }

  39. int LocateArray(Array A,va_list ap,int *offset)     /*根据数组中元素的下标,求出该元素在A中的相对地址offset*/
  40. {   
  41.     int i,instand;   
  42.     *offset=0;   
  43.     for(i=0;i<A.dim;i++)  
  44.     {      
  45.         instand=va_arg(ap,int);     
  46.         if(instand<0||instand> = A.bounds[i])      
  47.         return 0;      
  48.         *offset += A.constants[i]*instand;   
  49.     }  
  50.     return 1;
  51. }
zhiyonghe 发表于 2010-11-3 14:58 | 显示全部楼层
#define MaxArraySize 2
typedef struct
{   
    DataType *base;     /*数组元素的基地址*/   
    int dim;                    /*数组的维数*/
    int *bounds;           /*数组的每一维之间的界限的地址*/
    int *constants;       /*数组存储映像常量基地址*/
}Array;
int InitArray(Array *A,int dim,...)       /*数组的初始化操作*/
{   
    int elemtotal = 1,i;                        /*elemtotal是数组元素总数,初值为1*/   
    va_list ap;   
    if(dim<1||dim>MaxArraySize)        /*如果维数不合法,返回0*/      
    return 0;   
    A->dim = dim;   
    A->bounds = (int *)malloc(dim*sizeof(int));  /*分配一个dim大小的内存单元*/   
    if(!A->bounds)      
    exit(-1);   
    va_start(ap,dim);                    /*dim是一个固定参数,即可变参数的前一个参数*/   
    for(i=0;i<dim;++i)   
    {      
        A->bounds[i] = va_arg(ap,int);   /*依次取得可变参数,即各维的长度*/      
        if(A->bounds[i]<0)           
        return -1;                                   // 在math.h中定义为4      
        elemtotal *= A->bounds[i];       /*得到数组中元素总的个数*/   
    }   
    va_end(ap);  
    A->base = (DataType *)malloc(elemtotal*sizeof(DataType)); /*为数组分配所有元素分配内存空间*/   
    if(!A->base)      
    exit(-1);   
    A->constants = (int *)malloc(dim*sizeof(int));                   /*为数组的常量基址分配内存单元*/  
    if(!A->constants)     
    exit(-1);   
    A->constants[dim-1] = 1;  
    for(i=dim-2;i>=0;--i)     
    A->constants[i] = A->bounds[i+1]*A->constants[i+1];
    return 1;
}

int LocateArray(Array A,va_list ap,int *offset)     /*根据数组中元素的下标,求出该元素在A中的相对地址offset*/
{   
    int i,instand;   
    *offset=0;   
    for(i=0;i<A.dim;i++)  
    {      
        instand=va_arg(ap,int);     
        if(instand<0||instand> = A.bounds[i])      
        return 0;      
        *offset += A.constants[i]*instand;   
    }  
    return 1;
}
jack_shine 发表于 2010-11-3 15:24 | 显示全部楼层
路过学习~~~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:君子坦荡,小人常戚

0

主题

187

帖子

1

粉丝
快速回复 在线客服 返回列表 返回顶部