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