数组顺序存储表示和实现
来源:互联网 发布:一键汉化软件 编辑:程序博客网 时间: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
- 数组顺序存储表示和实现
- 数组的顺序存储表示和实现
- 数组的顺序存储表示和实现-数据结构
- (严蔚敏版)数组的顺序存储表示和实现代码
- 数据结构--数组和广义表--数组的顺序存储表示和实现
- 第五章 数组的数组的顺序存储表示和实现
- 数组的顺序结构表示和实现
- 数组的顺序表示和实现
- 数组的顺序表示和实现
- 数组的顺序表示和实现
- 数组的顺序表示和实现
- 数组的顺序表示和实现
- 数组的顺序表示和实现
- 数组的顺序表示和实现【严蔚敏】
- C语言数据结构——数组顺序存储结构的实现和表示
- 数组的顺序存储表示
- 数组的顺序存储表示
- 数据结构8:队列的顺序存储结构表示和实现
- hdu2594
- HDU 1394 Minimum Inversion Number 树状数组
- 《看板方法-科技企业渐进变革成功之道》书摘笔记【第9章】
- hdu1513 最长回文子序列
- List转换成JSON对象报错(二)
- 数组顺序存储表示和实现
- sublime text2使用笔记
- My first Python
- Android Spinner (Drop Down List) Example
- 代理模式解读
- hdu 1157 1108(水题)
- 《看板方法-科技企业渐进变革成功之道》书摘笔记【第10章】
- IOS IAP 遇到问题的总结
- oracle数据库的字符集