数组Array定义与操作

#include<stdio.h>//std(standard)  IO
#include<stdarg.h>//std(standard)  arguments
#define OK 1
#define ERROR 0
#define MAXDIM 8//定义的最大数组维度
typedef int Status;//表示返回的状态值 
typedef int ElemType//int来表示某一种元素类型




/*
1、几乎绝大部分语言中都将数组设置为默认类型,本章用抽象数据类型的形式描述和实现数组,以及高维数组
2、stdarg提供va_start(),va_arg(),va_end()三个函数来获得外部函数的不定长参数的值
3、
4、
5、

*/






//数组的结构体定义
typedef struct
{
	ElemType *base;
	int dim;//数组维数,在数组中1代表最高维,dim代表最低维
	int *bound;//每一维的长度bound[0]为最高维的长度,bound[dim-1]为最低维的长度
	int *constants;//对应维度的索引加减一时对应的内存跨度,即最低维索引加一仅在内存地址上加一,而第二低的则是bound[dim-1]*constants[dim-1]
}Array;



//初始化数组
//O(dim)
status InitialArray(Array &A,int dim,...)
{
	int i,total=1;//total存储总的需求的内存
	va_list args;//用于获取不定长参数的列表
	if(dim<1||dim>MAXDIM)//限制dim的范围
	{
		return ERROR;
	}
	A.dim=dim;//设置维数
	//给bound开辟一个数组存储每一维的长度
	A.bound=(int*)malloc(dim*sizeof(int));
	if(!A.bound)
	{
		exit(OVERFLOW);
	}
	va_start(args,dim);
	for(i=0;i<dim;i++)
	{
		A.bound[i]=va_arg(args,int)//获取不定长参数,其中args在va_arg函数之后会自动向前改变指针,第二个参数写获取的参数的类型
	    if(A.bound[i]<1)
		{
			return ERROR;//维的长度不允许小于一
		}
		total*=bound[i];//计算总的内存需求
	}
	va_end(args);
	
	//给constants开辟数组,存储每一维对应的内存跨度
	A.constants=(int*)malloc(dim*sizeof(int));
	if(!A.constants)
	{
		exit(OVERFLOW);
	}
	A.constants[dim-1]=1;//最小维的内存跨度为1	
	for(i=2;i<=dim;i++)
	{
		A.constants[dim-i]=A.constants[dim-i+1]*A.bound[dim-i+1];//低一维的长度和内存跨度相乘为高一维的内存跨度
	}
	//最后给数组开辟内存
	A.base=(ElemType*)malloc(total*sizeof(ElemType));
	return OK;
}




//销毁数组
//一次释放数组结构体中被分配存储的三个指针
//O(1)
Status destroy(Array &A)
{
	if(!A.base||!A.constants||!A.bound)
	{
		return ERROR;//若未初始化则销毁失败
	}
	free(A.base);
	free(A.bound);
	free(A.constants);
	A.base=NULL;
	A.bound=NULL;
	A.constants=NULL;
	return OK;
}


//读取索引对应在数组的值,通过e来返回
//O(A.dim)
Status GetValue(Array A,ElemType &e,...)
{
	int i,j,k;
	va_list args;
	va_start(args,e);//获取e后面的参数
	for(i=0;i<A.dim;i++)
	{
		j=va_args(args,int);//获取索引参数
		if(j<0||j=>A.bound[i])//超出索引范围则返回错误
		{
			return ERROR;
		}
		k+=j*A.constant[i];//记录总偏移
	}
	va_end(args);
	e=A.base[k];//用相对位置k来索引元素
	return OK;
}


//在对应索引的数组赋新的值
//O(A.dim)
Status SetValue(Array &A,ElemType e,...)
{
	int i,j,k;
	va_list args;
	va_start(args,e);//获取e后面的参数
	for(i=0;i<A.dim;i++)
	{
		j=va_args(args,int);//获取索引参数
		if(j<0||j=>A.bound[i])//超出索引范围则返回错误
		{
			return ERROR;
		}
		k+=j*A.constant[i];//记录总偏移
	}
	va_end(args);
	A.base[k]=e;
	return OK;
	
}


























  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值