标签:
//数组的顺序存储表示 //杨鑫 #include <stdio.h> #include <stdlib.h> #include <stdarg.h> #include <time.h> #define OK 1 #define ERROR 0 #define UNDERFLOW 2 #define MAX_ARRAY_DIM 8 typedef int Status; typedef int ElemType; typedef struct { ElemType *base; //数组的实体 int dim; //数组维数 int *bounds; //根据下文bound应该是bounds,数组各维的长度 int *constants; //数组映像函数常量的基址 }Array; //数组初始化 Status InitArray(Array *A, int dim,...) { int elemtotal=1,i; va_list ap; if (dim < 1 || dim > MAX_ARRAY_DIM) return ERROR; A->dim = dim; A->bounds = (int*)malloc(dim*sizeof(int)); if(!A->bounds) return ERROR; 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) return ERROR; A->constants=(int*)malloc(dim*sizeof(int)); if(!A->constants) return ERROR; 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; } //数组的销毁 Status DestroyArray(Array *A) { free(A->base); free(A->bounds); free(A->constants); return OK; } //找到A的地址 Status Locate(Array A,va_list ap,int *off) { int ind, i; *off=0; for(i=0;i<A.dim;++i){ ind=va_arg(ap,int); if(ind<0||ind>=A.bounds[i]) return ERROR; *off+=A.constants[i]*ind; } return OK; } //赋值把值赋值给数组A Status Assign(Array *A,ElemType e,...) { va_list ap; Status result; int i,j,k; int off; va_start(ap,e); if((result=Locate(*A,ap,&off))<0) return result; *(A->base+off)=e; va_end(ap); return OK; } //把值赋值给数组A中指定的元素e Status Value(Array A,ElemType *e,...) { int off; Status result; va_list ap; va_start(ap,e); if ((result=Locate(A,ap,&off))<0) return result; *e=*(A.base+off); va_start(ap,e); return OK; } int main() { int i,j,k; Array A; ElemType e; A.dim=3; InitArray(&A,A.dim,2,2,2); printf("这是一个 %d 维的数组!\n",A.dim); printf("数组每个维度的大小:\n"); for (i=0;i<A.dim;i++) printf("第 %d 个维度大小为: %5d\n",i + 1, A.bounds[i]); printf("函数常量的基址:\n"); for (i=0;i<A.dim;i++) printf("第 %d 个基址 : %5d\n",i + 1,A.constants[i]); printf("\n输入任意值继续程序!\n"); getchar(); printf("随机生成一组数据:\n"); srand(time(0)); for (i=0;i<A.bounds[0];i++) for (j=0;j<A.bounds[1];j++) for(k=0;k<A.bounds[2];k++) Assign(&A,rand()%100,i,j,k); printf("数组A的成员是::\n"); for (i=0;i<A.bounds[0];i++) { for (j=0;j<A.bounds[1];j++) { printf("("); for (k=0;k<A.bounds[2];k++) { Value(A,&e,i,j,k); printf(" %5d ", e); } printf(") "); } printf("\n"); } printf("与之等效的一维数组是:\n"); for (i=0; i<A.bounds[0]*A.bounds[1]*A.bounds[2]; i++) printf("%5d",A.base[i]); printf("\n"); DestroyArray(&A); getchar(); return 0; }
如图:
标签:
原文地址:http://blog.csdn.net/u012965373/article/details/46128737