数据结构:多维数组的编程实现

    科技2022-07-21  97

    下面给出了多维数组的完整程序。该程序在VC++ 6.0和Dev-C++下编译通过。代码主要参考了严蔚敏老师的教材,本人完成了main函数的编写。注意在Assign和Value两个函数中多定义了一个参数temp用于占位,没有实际用途。如果没有temp这个参数,在VC++6.0下结果不正确。

    #include "stdio.h" #include "stdlib.h" #include"stdarg.h " #define ERROR 0 #define MAX_ARRAY_DIM 8 //假设数组的最大维数为8 typedef struct { int *base;//存储数组元素的首地址(基址),由InitArray分配 int dim; //数组的维数 int *bounds; //存放数组维界的基地址,由InitArray分配 int *constants; //存放映象函数常量基址,由InitArray分配 }Array; int InitArray(Array &A, int dim,...) { //若维数 dim 和各维长度合法,构造数组A,并返回1 if(dim<1||dim> MAX_ARRAY_DIM ) return ERROR; A.dim=dim; A.bounds=(int*)malloc(dim*sizeof(int)); if(! A.bounds) exit(-2); //若各维长度合法,则存入A.bounds int i,elemtotal=1; va_list ap; va_start(ap,dim); for(i=0;i<dim;i++) { A.bounds[i]=va_arg(ap,int); if(A.bounds[i]<0) return -2; elemtotal*= A.bounds[i]; } va_end(ap); A.base= (int *)malloc(elemtotal*sizeof(int)); if(!A.base) exit(-2); A.constants=(int*)malloc(dim*sizeof(int)); if(!A.constants) exit(-2); //求映象函数的值 A.constants[dim-1]=1; //L=1,指针的增减以元素大小为单位 for(i=dim-2;i>=0;i--) A.constants[i]= A.bounds[i+1] *A.constants[i+1]; return 1; }// InitArray 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 1; }// DestroyArray int Locate(Array A, va_list ap, int &off) { //若ap所指下标合法,则求出元素在数组中的相对位置off // 最终off带回在存储该元素时已经存储的元素个数 int i,ind; off=0; for(i=0; i<A.dim;i++) { ind=va_arg(ap,int); if (ind<0||ind>=A.bounds[i]) return(-2); off+=A.constants[i]*ind; } return 1; }// Locate int Assign(Array &A, int e, int temp, ...) //temp为占位用的,没有实际用途 { int off,result; va_list ap; va_start(ap,temp); if((result=Locate(A,ap,off))<=0) return result; va_end(ap); *(A.base+off)=e; return 1; }//Assign int Value(Array A, int &e, int temp, ...) //temp为占位用的,没有实际用途,如果去掉,在vc++ 6.0下运行结果不正确 { //若各下标不超界,则e赋值为所指定的A 的元素值 va_list ap; int off,result; va_start(ap,temp); if((result=Locate(A,ap,off))<=0) return result; va_end(ap); e=*(A.base+off); return 1; }// Value int main() { Array A; //定义数组A int e1,e2; InitArray(A,4,5,10,7,3);//创建数组A,维数为4维,每一维的大小分别为5,10,7,3 e1=18; Assign(A,e1,0,4,7,3,1); //将下标为4,7,3,1的数组元素赋值为18 Value(A,e2,0,4,7,3,1); //读取下标为4,7,3,1的数组元素的值到e2 printf("下标为4,7,3,1的数组元素的值为%d\n",e2); DestroyArray(A); return 0; }

     

    Processed: 0.011, SQL: 8