数组的顺序表示和实现

#include "stdio.h"
#include "stdarg.h"//标准的都文件,提供va_start,va_arg,va_end,用于存储变长的参数
#define MAX_LENGH 8//规定数组的最大的维数
#include "stdlib.h"
typedef int Status;

typedef int ElemType;
#define OK 1
#define ERROR -1
typedef struct {
	ElemType * base;//数组的首地址,用一组连续的地址表示
	int dim;//存发的是数组的维数
	int *bounds;//数组的维数的基地址
	int *constants;//数组映像函数常量基地址
}Array;


Status InitArray (Array *arr,int dim,...) {
	int i;	
	va_list list;
	int total = 1;//表示的是数组中元素的个数
	arr->dim = dim;
	va_start(list,dim);
	arr->bounds = (int*)malloc( dim * sizeof(int));
	for (i = 0;i < dim;i++) {
		arr->bounds[i] = va_arg (list,int);
		total = total * arr->bounds[i];
	}
	arr->base = (ElemType *)malloc(total * sizeof (ElemType));
	va_end (list);
	arr->constants = (int *)malloc((dim - 1) * sizeof(int));//实际上保存的是每一位的步进的长度,就是指针加上1时,指针应该指示的地址。
	arr->constants[dim - 1] = 1;
	for (i = dim - 2;i >=0;--i) {
		arr->constants[i] = arr->bounds[i + 1] * arr->constants[i + 1];//
	}
	return  OK;
}

Status destroyArray (Array *arr) {
	if (arr->base) {
		free(arr->base);
		arr->base = NULL;
	}
	if (arr->bounds) {
		free(arr->bounds);
		arr->bounds = NULL;
	}
	if (arr->constants) {
		free (arr->constants);
		arr->constants = NULL;
	}
	arr->dim = 0;
	return OK;
}

//不知在主函数中调用的,但是因为下面的value和Assign都要用到类似的定位,所以提取出来
Status Locate (Array *arr,va_list list,int *off) {//根据相应的哦list指向的值得出在arr->base指向的相对的位置
	int i;
	int temp;
	*off = 0;//相对于基地址的偏移量
	for (i = 0;i < arr->dim;i++) {
		temp = va_arg (list,int);
		if (temp < 0 || temp >= arr->bounds[i]) {
			return ERROR;
		}
		*off += temp * arr->constants[i];
	}
	return OK;
}



Status Assign (Array *arr,ElemType e,...) {
	va_list list;
	Status result;
	int off;
	va_start (list,e);
	result = Locate(arr,list,&off);
	if (result == ERROR) {
			return ERROR;
	}else {
		*(arr->base + off) = e;
	}
	va_end (list);
	return OK;
}

int Value (Array *arr,ElemType *e,...) {
	va_list list;
	int result;
	int off;
	va_start (list,e);
	result = Locate(arr,list,&off);
	if (result == ERROR) {
		return ERROR;
	}else {
		*e = *(arr->base + off );
		return OK;
	}
}

int main () {
	Array arr;
	int i;
	int j;
	int k;
	int count = 0;
	int temp;
	InitArray(&arr,3,3,4,2);
	for (i = 0;i < 3;i++) {
		for (j = 0;j < 4;j++) {
			for (k = 0;k < 2;k++) {
				Assign (&arr,count++,i,j,k);
			}
		}
	}
	
	
	for (i = 0;i < 3;i++) {
		for (j = 0;j < 4;j++) {
			for (k = 0;k < 2;k++) {
				Value (&arr,&temp,i,j,k);
				printf("%d ",temp);
			}
		}
	}
	return 0;
}

数组的顺序表示和实现
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值