数组顺序存储表示和实现

来源:互联网 发布:一键汉化软件 编辑:程序博客网 时间:2024/04/29 20:03

实现:

/***************************************数组的顺序表示和实现by Rowandjj2014/5/2----------------不管是多少维的数组,在内存中都是线性存储的,数组中每个元素都对应着一个物理地址,它们之间满足一个线性的关系。比如,3维数组,3*3*2架构,即A[3][3][2],对应常量为6,2,1bounds    constants  3           6  3           2  2           1所以A[0][2][1]相对基地址的偏移为0*6+2*2+1 = 5注:内存中实际排列情况如下:A[0][0][0] A[0][0][1] A[0][1][0] A[0][1][1] A[0][2][0] A[0][2][1]...***************************************/#include<iostream>#include<stdarg.h>using namespace std;#define MAX_ARRAY_DIM 8//数组维数最大值//------------数组的顺序存储表示------------------------------typedef int ElemType;typedef struct _ARRAY_{    ElemType *pBase;//数组元素基址    int dim;//维数    int *pBounds;//维边界    int *pContants;//数组映像函数常量}Array,*pArray;bool InitArray(pArray pArrayTemp,int iDim,...);    //初始化数组bool DestroyArray(pArray pArrayTemp);//销毁数组void TravelArray(pArray pArrayTemp);//遍历bool Assign(pArray pArrayTemp,ElemType e,...);//若下标合法,将e的值赋给所指定的A的元素,并返回truebool Locate(pArray pArrayTemp,va_list temp,int *offset);//求出指定元素在数组中的相对地址(偏移量)bool Value(pArray pArrayTemp,ElemType *e,...);//获取指定位置上的数组值bool InitArray(pArray pArrayTemp,int iDim,...){    if(iDim<1 || iDim>MAX_ARRAY_DIM)    {        return false;    }    pArrayTemp->dim = iDim;    int i = 0;            pArrayTemp->pBounds = (int*)malloc(sizeof(int)*iDim);//为维边界申请内存    if(pArrayTemp->pBounds == NULL)    {        return false;    }    va_list temp = {0};    va_start(temp,iDim);    int elemTotal = 1;    for(i = 0; i < iDim; i++)    {        pArrayTemp->pBounds[i] = va_arg(temp,int);//给维边界赋值        if(pArrayTemp->pBounds[i] < 0)        {            free(pArrayTemp->pBounds);            return false;        }        elemTotal *= pArrayTemp->pBounds[i];//获取总的元素个数,即每一维的长度相乘    }    va_end(temp);    pArrayTemp->pBase = (ElemType *)malloc(sizeof(ElemType)*elemTotal);//为每一个元素申请内存    if(pArrayTemp->pBase == NULL)    {        free(pArrayTemp->pBounds);        return false;    }        pArrayTemp->pContants = (int *)malloc(sizeof(int) * iDim);//为映射函数常量值申请内存    if(pArrayTemp->pContants == NULL)    {        free(pArrayTemp->pBounds);        free(pArrayTemp->pBase);        return false;    }    pArrayTemp->pContants[iDim-1] = 1;    for(i=iDim-2; i>=0; i--)    {        pArrayTemp->pContants[i] = pArrayTemp->pContants[i+1]*pArrayTemp->pBounds[i+1];//给映射函数常量赋值    }    return true;}bool DestroyArray(pArray pArrayTemp){    if(pArrayTemp->pBase != NULL)    {        free(pArrayTemp->pBase);        pArrayTemp->pBase = NULL;    }    if(pArrayTemp->pBounds != NULL)    {        free(pArrayTemp->pBounds);        pArrayTemp->pBounds = NULL;    }    if(pArrayTemp->pContants != NULL)    {        free(pArrayTemp->pContants);        pArrayTemp->pContants = NULL;    }    return true;}void TravelArray(pArray pArrayTemp){    int i;    cout<<"dim:"<<pArrayTemp->dim<<endl;    cout<<"bounds:";    for(i = 0; i < pArrayTemp->dim; i++)    {        cout<<pArrayTemp->pBounds[i]<<" ";    }    cout<<endl;    cout<<"pConstants:";    for(i = 0; i<pArrayTemp->dim; i++)    {        cout<<pArrayTemp->pContants[i]<<" ";    }    cout<<endl;    cout<<"data:";    int count = 1;    for(i = 0; i < pArrayTemp->dim; i++)    {        count *= pArrayTemp->pBounds[i];    }    for(i = 0; i < count; i++)    {        cout<<pArrayTemp->pBase[i]<<" ";    }    cout<<endl;}bool Assign(pArray pArrayTemp,ElemType e,...){    va_list temp = {0};    int offset = 0;    va_start(temp,e);    bool result = Locate(pArrayTemp,temp,&offset);    *(pArrayTemp->pBase + offset) = e;    va_end(temp);    return result;}bool Locate(pArray pArrayTemp,va_list temp,int *offset){    int iTemp = 0;    int i = 0;    *offset = 0;//将偏移量初始化为0    for(i = 0; i < pArrayTemp->dim; i++)    {        iTemp = va_arg(temp,int);        *offset += iTemp*(pArrayTemp->pContants[i]);    }    return true;}bool Value(pArray pArrayTemp,ElemType *e,...){    va_list temp;    va_start(temp,e);    bool result = false;    int offset;    result = Locate(pArrayTemp,temp,&offset);    *e = pArrayTemp->pBase[offset];    va_end(temp);    return result;}

测试:

int main(){    Array ArrayTemp = {0};    InitArray(&ArrayTemp,3,3,2,2);    int i = 0,j = 0,k = 0;    for(i = 0; i<ArrayTemp.pBounds[0];i++)    {        for(j = 0; j < ArrayTemp.pBounds[1];j++)        {            for(k = 0; k <ArrayTemp.pBounds[2];k++)            {                Assign(&ArrayTemp,i*100+j*10+k,i,j,k);            }        }    }    ElemType e;    Value(&ArrayTemp,&e,1,1,1);    TravelArray(&ArrayTemp);    cout<<"e = "<<e<<endl;    DestroyArray(&ArrayTemp);    return 0;}

结果:


1 0
原创粉丝点击