实现:
/*************************************** 数组的顺序表示和实现 by Rowandjj 2014/5/2 ---------------- 不管是多少维的数组,在内存中都是线性存储的, 数组中每个元素都对应着一个物理地址,它们之间满足一个线性的关系。 比如,3维数组,3*3*2架构,即A[3][3][2],对应常量为6,2,1 bounds 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的元素,并返回true bool 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; }
结果:
数组顺序存储表示和实现
时间: 2024-11-02 11:40:35