数组

所谓数组,是有序的元素序列。 若将有限个类型相同的变量的集合命名,那么这个名称为数组名。组成数组的各个变量称为数组的分量,也称为数组的元素,有时也称为下标变量。用于区分数组的各个元素的数字编号称为下标。数组是在程序设计中,为了处理方便, 把具有相同类型的若干元素按无序的形式组织起来的一种形式。 这些无序排列的同类数据元素的集合称为数组。
数组是用于储存多个相同类型数据的集合。

1.数组的实现

在实现之前先把需要使用到的库和头文件进行包含 
所需的头文件array.h已经在上方提供

#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include "array.h"
1)初始化数组
Status InitArray(Array &A,int dim,...){
	//初始化数组
	//若维数dim和各维长度合法,则构造相应的数组A,并返回OK 
	va_list ap;//用于获取不确定个数的参数
	int i;
	if(dim<1 || dim>MAX_ARRAY_DIM) 
	return ERROR;
	A.dim = dim;
	A.bounds = (int *)malloc(dim * sizeof(int));
	if(!A.bounds)
	return ERROR;
	int elemtotal = 1;//若各维长度合法,则存入A.bounds,并求出A的元素总数elemtotal
	va_start(ap,dim);//获取可变参数列表的第一个参数的地址(ap是类型为va_list的指针,dim是可变参数最左边的参数)
	for(i=0;i<dim;++i){
		A.bounds[i]=va_arg(ap,int);//读入一个变长参数
		if(A.bounds[i]<0)
		return ERROR;
		elemtotal *= A.bounds[i]; 
	}	 
	va_end(ap);//清空va_list可变参数列表
	A.base = (ElemType *)malloc(elemtotal * sizeof(ElemType));
	if(!A.base)
	return ERROR;
	//求影像函数的常数ci,并存入A.constants[i-1],i=1,...,dim
	A.constants = (int *)malloc(dim * sizeof(int));
	if(!A.constants)
	return ERROR;
	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 OK;
}//InitArray
2)销毁数组
Status Destory(Array &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 OK; 
}//Destory
3)求指定元素索引
Status Locate(Array A,va_list ap,int &off){
	//若ap指示的各下标值合法,则求出该元素在A中相对地址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 ERROR;
		off += A.constants[i] * ind;
	} 
}//Locate
4)在指定索引处添加元素
Status Value(Array A,ElemType &e,...){
	//A是n维数,e为元素变量,随后是n个下标值
	//若各下标不超界,则e赋值为所指定的A的元素值,并返回OK
	int result;
	int off;
	va_list ap;
	va_start(ap,e);
	if((result=Locate(A,ap,off))<=0)
	return result;
	e = *(A.base+off);
	return OK; 
}//Value