首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > 软件架构设计 >

请大哥大姐帮小弟我讲解一下数据结构(清华严的C版)建立数组的算法,小弟我看不太明白

2012-03-02 
请大哥大姐帮我讲解一下数据结构(清华严的C版)建立数组的算法,我看不太明白#includestdarg.h#defineMAX_

请大哥大姐帮我讲解一下数据结构(清华严的C版)建立数组的算法,我看不太明白
#include   <stdarg.h>
#define   MAX_ARRAY_DIM   8                 //假设数组维数的最大值
typedef   struct{
        ElemType         *base;                   //数组元素基址
        int                   dim;                       //数组维数
        int                   *bounds;               //数组维界基址
        int                   *constants;         //数组映像函数常量基址
}Array;

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));
//若各维长度合法,则存入A.bounds,并求出A的元素总数elemtotal
        if(!A.bounds){
                exit(OVERFLOW);
        }
        elemtotal   =   1;
        va_start(ap.dim);
        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){
//求映像函数的常数Ci,并存入A.constants[i   -   1],i   =   1,...,dim
                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;
}

[解决办法]
这个算法先定义了一个数组的结构,
base是数组每维元素的首地址;
bounds是数组的维的首地址;
contants不太明白;
接下来就是把函数的参数赋给A的各个元素,
先判断dim是否合法;
若合法则分配bounds内存空间;
把每维的长度存入bounds中;
va_start()我没见过,应该是stdarg.h中的,你查一下,
elemtotal * = A.bounds[i]求A中元素的总数;
A.base = (ElemType *)malloc(elemtotal * sizeof(ElemType))给A分配内存空间;


A.constants[dim - 1] = 1;
for(i = dim -2;i > = 0;--i){
A.constants[i] = A.bounds[i + 1] * A.constants[i + 1];


}
用到映像函数不明白;

[解决办法]
所谓数组的初始化,就是将数组类型的变量按照需要使用的空间大小,以及数组维数等信息都预先定义好,以便后来的使用
typedef struct{
ElemType *base; //数组元素基址
int dim; //数组维数
int *bounds; //数组维界基址
int *constants; //数组映像函数常量基址
}Array;
上述数据结构,以二维数组 A[7][3]为例,
执行初始化后的结果应该是:
base指向7*3*sizeof(Elemtype)大小空间的指针,dim的值为2 ,bounds指向数组大小为2(维数)的空间,第一维的大小为7,第二维的大小为3,constants指向的数组大小也为2,只是为了定位数组中的元素方便而设,减少运算而已,可以不要的,它的值应该是3和1,数组按行优先存储时,每一维的单位,算法中把Elemtype的大小设为1,
需要说明的是函数参数(Array &A,int dim,...),后面3个点表示调用时后面还可以有参数(参数个数不定时加)
调用该函数时是这样的InitArray(A,2,7,3)。
va_start、va_end等在stdarg.h中有定义,是宏


[解决办法]
大哥,好好钻研一下c语言和数据结构咯

热点排行