_DataStructure_C_Impl:Array

来源:互联网 发布:暴雪游戏平台 mac版 编辑:程序博客网 时间:2024/06/05 09:03
#include<stdio.h>#include<stdlib.h>#include<stdarg.h>#define MaxArraySize 2typedef int DataType;typedef struct{DataType *base;//数组元素的基地址int dim;//数组的维数int *bounds;//数组的每一维之间的界限的地址int *constants; //数组存储映像常量基地址}Array;//数组的初始化操作int InitArray(Array *A,int dim,...){int elemtotal=1,i;//elemtotal是数组元素总数,初值为1va_list ap;//声明va_listif(dim<1||dim>MaxArraySize)//如果维数不合法,返回0return 0;A->dim=dim;A->bounds=(int *)malloc(dim*sizeof(int));//分配一个dim大小的内存单元if(!A->bounds)exit(-1);va_start(ap,dim);//dim是一个固定参数,即可变参数的前一个参数for(i=0;i<dim;++i){A->bounds[i]=va_arg(ap,int);//依次取得可变参数,即各维的长度if(A->bounds[i]<0)return -1;elemtotal*=A->bounds[i];//得到数组中元素总的个数}va_end(ap);A->base=(DataType *)malloc(elemtotal*sizeof(DataType));//为数组分配所有元素分配内存空间if(!A->base)exit(-1);A->constants=(int *)malloc(dim*sizeof(int));//为数组的常量基址分配内存单元if(!A->constants)exit(-1);A->constants[dim-1]=1;for(i=dim-2;i>=0;--i)A->constants[i]=A->bounds[i+1]*A->constants[i+1];return 1;}//销毁数组。将动态申请的内存单元释放void DestroyArray(Array *A){if(A->base)free(A->base);if(A->bounds)free(A->bounds);if(A->constants)free(A->constants);A->base=A->bounds=A->constants=NULL;//将各个指针指向空A->dim=0;}//根据数组中元素的下标,求出该元素在A中的相对地址offsetint LocateArray(Array A,va_list ap,int *offset){int i,instand;*offset=0;for(i=0;i<A.dim;i++){instand=va_arg(ap,int);if(instand<0||instand>=A.bounds[i])return 0;*offset+=A.constants[i]*instand;}return 1;}//返回数组中指定的元素,将指定的数组的下标的元素赋值给eint GetValue(DataType *e,Array A,...){va_list ap;int offset;va_start(ap,A);if(LocateArray(A,ap,&offset)==0)//找到元素在数组中的相对位置return 0;va_end(ap);*e=*(A.base+offset);//将元素值赋值给ereturn 1;}//数组的赋值操作。将e的值赋给的指定的数组元素int AssignValue(Array A,DataType e,...){va_list ap;int offset;va_start(ap,e);if(LocateArray(A,ap,&offset)==0)//找到元素在数组中的相对位置return 0;va_end(ap);*(A.base+offset)=e;//将e赋值给该元素return 1;}void main(){Array A;DataType B[4][3]={{5,6,7},{23,45,67},{35,2,34},{12,36,90}};int i,j;int dim=2,bound1=4,bound2=3;/*初始化数组的维数和各维的长度*/DataType e;InitArray(&A,dim,bound1,bound2);/*构造一个4×3的二维数组A*/printf("数组A的各维的长度是:");for(i=0;i<dim;i++)/*输出数组A的各维的长度*/printf("%3d",A.bounds[i]);printf("\n数组A的常量基址是:");for(i=0;i<dim;i++)/*输出数组A的常量基址*/printf("%3d",A.constants[i]);printf("\n%d行%d列的矩阵元素如下:\n",bound1,bound2);for(i=0;i<bound1;i++){for(j=0;j<bound2;j++){AssignValue(A,B[i][j],i,j);/*将数组B的元素赋值给A*/GetValue(&e,A,i,j);/*将数组A中的元素赋值给e*/printf("A[%d][%d]=%3d\t",i,j,e); /*输出数组A中的元素*/}printf("\n");}printf("按照数组的线性序列输出元素,即利用基地址输出元素:\n");for(i=0;i<bound1*bound2;i++)/*按照线性序列输出数组A中的元素*/{printf("第%d个元素=%3d\t",i+1,A.base[i]);if((i+1)%bound2==0)printf("\n");}DestroyArray(&A);system("pause");}

1 0
原创粉丝点击