_DataStructure_C_Impl:Array

#include<stdio.h>
#include<stdlib.h>
#include<stdarg.h>
#define MaxArraySize 2
typedef int DataType;
typedef struct{
	DataType *base;	//数组元素的基地址
	int dim;		//数组的维数
	int *bounds;	//数组的每一维之间的界限的地址
	int *constants; //数组存储映像常量基地址
}Array;
//数组的初始化操作
int InitArray(Array *A,int dim,...){
	int elemtotal=1,i;	//elemtotal是数组元素总数,初值为1
	va_list ap;		//声明va_list
	if(dim<1||dim>MaxArraySize)		//假设维数不合法。返回0
		return 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中的相对地址offset int 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; } //返回数组中指定的元素。将指定的数组的下标的元素赋值给e int 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); //将元素值赋值给e return 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"); }


posted @ 2017-06-08 17:08  jzdwajue  阅读(63)  评论(0编辑  收藏  举报