您的位置:首页 > 理论基础 > 数据结构算法

(数据结构第五章)数组实现

2015-04-11 15:06 281 查看
///********数组顺序存储表示***********
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<stdarg.h>
///标准头文件,提供va_start、va_arg和va_end
///用于存取变长参数表
using namespace std;
#define MAX_ARRAY_DTM 8 ///假设数组位数最大值为8
#define ERROR 0
#define OVERFLOW -2
#define UNDERFLOW -100
#define OK 1
typedef struct
{
    int *base;  ///数组元素基址,由 InitArray分配
    int dim;    ///数组维数
    int *bounds;    ///数组维界基址,由 InitArray分配
    ///暂时不太清楚这是干啥的
    int *constants; ///数组映像函数常量基址,由 InitArray分配
    ///这个就是用来存放ci的。给出ci的递归定义:Cn = L, Ci-1=Bi*Ci,1<=i<=n
}Array;
bool InitArray(Array &A, int dim,...)
{
    ///若维数dim和各维长度合法,则构造相应数组A,并返回OK
    if(dim < 1 || dim > MAX_ARRAY_DTM) return ERROR;
    A.dim = dim;
    A.bounds = (int *)malloc(dim * sizeof(int));
    if(!A.bounds) exit(OVERFLOW);
    ///若各维度长度合法,则存入A.bounds,并求出A的元素总数elemtotal
    int elemtotal = 1;
    va_list ap;
    va_start(ap, dim);  ///ap为va_list类型,是存放变长参数表信息的数组
    for(int 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 = (int *)malloc(elemtotal * sizeof(int));
    if(!A.base) exit(OVERFLOW);
    ///求映像函数的常数c,并存入A.constants[i + 1],i=1,...,dim
    A.constants = (int *)malloc(dim * sizeof(int));
    if(!A.constants) exit(OVERFLOW);
    A.constants[dim - 1] = 1;
    ///L=1,指针的增减以元素的大小为单位
    ///L的话不应该是1啊
    for(int i=dim - 2; i >= 0; --i)
        A.constants[i] = A.bounds[i+1]*A.constants[i+1];
    return OK;

}
int DestroyArray(Array &A)
{
    ///销毁数组A
    if(!A.base) return ERROR;
    free(A.base) ; A.base = NULL;
    if(!A.bounds) return ERROR;
    free(A.bounds); A.bounds=NULL;
    if(!A.constants) return ERROR;
    free(A.constants);  A.constants = NULL;
    return OK;
}
int Locate(Array A, va_list ap, int &off)
{
    ///若ap指示的各下标值合法,则求出该元素在A中相对地址off
    off=0;
    for(int i=0;i<A.dim;i++)
    {
        int ind = va_arg(ap, int);
        if(ind < 0 || ind >= A.bounds[i]) return OVERFLOW;
        off += A.constants[i] * ind;
    }
    return OK;
}
int Value(Array A, int &e,...)
{
    ///A是n维数组,e为元素变量,随后是n个下标值
    ///若各下标不超界,则e赋值为所指定的A的元素值,并返回OK
    va_list ap;
    va_start(ap,e);
    int result,off;
    if((result = Locate(A,ap,off))<=0) return result;
    e = *(A.base + off);
    return OK;
}
int Assign(Array &A, int e,...)
{
    ///A是n维数组,e为元素变量,随后是n个下标值
    ///若下标不超界,则将e的值赋值给所指定A的元素,并返回OK
    va_list ap;
    va_start(ap, e);
    int result,off;
    if((result = Locate(A,ap,off))<=0) return result;
    *(A.base + off) = e;
    return OK;
}
int main()
{
    Array A;
    InitArray(A,2,5,5);

    ///测试Assign
    Assign(A,0,0,0);

    ///测试Value
    int e=100;
    Value(A,e,0,0);
    printf("e=%d\n",e);

    DestroyArray(A);
    return 0;
}
中途竟然去找Locate函数传的参数怎么用,以为直接在main里用呢...sb了
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: