資料結構實驗 多維陣列的實現

球王武磊發表於2020-11-18

資料結構實驗 多維陣列的實現

#include<stdio.h>
#include<stdlib.h>
#include<stdarg.h>//用於存取變長參數列 

#define MAX_DIM 8//假設陣列維數的最大值為8 

typedef struct
{
	int *base;//陣列元素基址 
	int dim;//陣列維數 
	int *bounds;//陣列維數基址,例如維數dim=3,bounds[0]=2,bounds[1]=3,bounds[2]=4,表示2頁3行4列的陣列 
	int *constants;//陣列映像函式常量基址 
	/*  例如對於2頁3行4列的陣列,有constants[2]=1,constants[1]=4,constants[0]=12, 
	    給定一個下標A[0][1][2],0*12+1*4+2*1=6,元素存取在當前陣列的第6個位置,再加上base即可找到它的地址 
	*/ 
}Array;


bool init(Array &A,int dim,...)//構造陣列 
{
	if(dim<1||dim>MAX_DIM)
		return false;
	A.dim=dim;
	A.bounds=(int *)malloc(dim*sizeof(int));
	if(!A.bounds) return false;
	int total=1;//求元素總數 
	va_list list;//存放變長參數列資訊的陣列list 
	va_start(list,dim);
	for(int i=0;i<dim;i++)
	{
		A.bounds[i]=va_arg(list,int);
		if(A.bounds[i]<=0)
			return false;
		total*=A.bounds[i];
	}
	va_end(list);
	A.base=(int *)malloc(total*sizeof(int));
	if(!A.base) return false;
	A.constants=(int *)malloc(dim*sizeof(int));
	if(!A.constants) return false;
	A.constants[dim-1]=1;//最後一維為1,指標的增減以元素的大小為單位 
	for(int i=dim-2;i>=0;i--)
		A.constants[i]=A.bounds[i+1]*A.constants[i+1];
	return true;
}

bool destroy(Array &A)//銷燬陣列 
{
	if(!A.base) return false;
	free(A.base); A.base=NULL;
	if(!A.bounds) return false;
	free(A.bounds); A.bounds=NULL;
	if(!A.constants) return false;
	free(A.constants); A.constants=NULL;
	return true;
}

bool locate(Array &A,va_list list,int &off)//求元素在陣列A中的相對地址off 
{
	off=0;
	for(int i=0;i<A.dim;i++)
	{
		int temp=va_arg(list,int);
		if(temp<0||temp>=A.bounds[i]) return false;
		off+=A.constants[i]*temp;
	}
	return true;
}

bool value(Array &A,int &e,...)//將e賦值為所指定的A的元素值 
{
	va_list list;
	va_start(list,e);
	int off=0;
	if(!locate(A,list,off)) return false;
	e=*(A.base+off);
	va_end(list);
	return true;
}

bool assign(Array &A,int e,...)//將e賦值給所指定的A的元素 
{
	va_list list;
	va_start(list,e);
	int off=0;
	if(!locate(A,list,off)) return false;
	*(A.base+off)=e;
	va_end(list);
	return true;
}

void print(Array &A)//列印陣列各元素的值 
{
	int total=1;
	for(int i=0;i<A.dim;i++)
		total*=A.bounds[i];
	for(int i=0;i<total;i++)
	{
		printf("%d\t",*(A.base+i));
		if((i+1)%A.bounds[A.dim-1]==0)
			printf("\n");
	}
}


int main()
{
	//資料測試 
	Array A;
	init(A,3,2,3,4);//構造陣列:3維陣列,2頁3行4列 
	int temp=0;
	for(int i=0;i<2;i++)
	for(int j=0;j<3;j++)
	for(int k=0;k<4;k++)
		assign(A,++temp,i,j,k);
	printf("陣列各元素的值為:\n");
	print(A);//列印陣列各元素的值 
	int e;
	value(A,e,0,1,3);
	printf("元素(0,1,3)的值為%d\n",e);
	e=99;
	for(int i=0;i<4;i++)
		assign(A,e,1,2,i);//將第1頁第2行中的所有元素值修改為99 
	printf("將第1頁第2行中的所有元素值修改為99\n");
	printf("陣列各元素的值為:\n");
	print(A);//列印陣列各元素的值 
	destroy(A);//銷燬陣列 
	return 0;
}

相關文章