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

下面给出了多维数组的完整程序。该程序在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;
}

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值