/**
***@Title :考研数据结构复习
***@Subject :数组(顺序结构)
***@Author :lxfhahaha
***@language: C语言
***@Time : 2018/10/4 19:25
*****/
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h> //用于存取变长参数表
#include <time.h>
#define MAX_ARRAY_DIM 8 //假设数组维数的最大值为8
#define OK 1
#define ERROR 0
#define TRUE 1
#define FALSE 0
typedef int Bool;
typedef int ElemType;
typedef int Status;
typedef struct {
ElemType *base; //数组元素基址
int dim; //数组维数
int *bounds; //数组维界机基址,用于存储每一维的长度
int *constants; //数组映像函数常量基址
}Array;
//若维数dim和随后的各维长度合法,则构造相应的数组array,并返回ok
Status InitArray(Array *array,int dim, ... ){
int i,j;
if(dim<1||dim>MAX_ARRAY_DIM){
printf("Error Dim!!\n");
return ERROR;
}
array->dim=dim;
array->bounds=(int*)malloc(sizeof(int)*dim);
if(!array->bounds){
printf("Malloc Error!\n");
exit(0);
}
int elemtotal=1;
va_list ap;
va_start(ap,dim);
for(i=0;i<dim;i++){
array->bounds[i]=va_arg(ap,int);
elemtotal *= array->bounds[i];
}
va_end(ap);
array->base=(ElemType*)malloc(sizeof(ElemType)*elemtotal);
array->constants=(int*)malloc(sizeof(int)*dim);
if(!array->base||!array->constants){
printf("Malloc Error!\n");
exit(0);
}
array->constants[dim-1]=1; //最后的一维是一维数组,,参数固定为1
for(j=dim-2;j>=0;j--){
array->constants[j]=array->constants[j+1]*array->bounds[j+1];
}
return OK;
}
//销毁数组array
Status DestroyArray(Array *array){
if(!array->base) return ERROR;
free(array->base);
array->base=NULL;
if(!array->bounds) return ERROR;
free(array->bounds);
array->bounds=NULL;
if(!array->constants) return ERROR;
free(array->constants);
array->constants=NULL;
return OK;
}
//若ap所指示的各下标值合法,则求出个该元素在array中相对地址off
Status Locate(Array array, va_list ap, int *off)
{
int i,j;
*off = 0;
for(i=0;i<array.dim;i++){
j=va_arg(ap,int); //依次取出每一维的下标
if (j<0||j>array.bounds[i])
{ printf("j:%d,,bo:%d\n",j, array.bounds[i]); return ERROR;}
*off += array.constants[i]*j;//计算待存取的元素和数组基址的距离
}
return OK;
}
//array是n维数组,e为元素变量,随后是n个下标值
//若各下标不超界,则e赋值为所指定的array的元素值,并返回OK
Status Value(Array array,ElemType *e, ...){
int off;
if(!array.base){
printf("Error!! Please inital first!!\n");
return ERROR;
}
va_list ap;
va_start(ap,e);
if(!Locate(array,ap,&off)){
printf("Locate Error!!\n");
return ERROR;
}
va_end(ap);
*e=*(array.base+off);
return OK;
}
//array是n维数组,e为元素变量,随后是n个下标值
//若下标不超界,则将e的值赋给指定的array的元素值,并返回OK
Status Assign(Array *array,ElemType e, ...){
int off;
if(!array->base){
printf("Error!! Please inital first!!\n");
return ERROR;
}
va_list ap;
va_start(ap,e);
if(!Locate(*array,ap,&off)){
printf("Locate Error!!\n");
return ERROR;
}
va_end(ap);
*(array->base+off)=e;
return OK;
}
int main(){
int i,j,k;
ElemType temp;
Array array;
InitArray(&array,3,5,3,7);
for(i=0;i<array.bounds[0];i++)
for(j=0;j<array.bounds[1];j++)
for(k=0;k<array.bounds[2];k++)
Assign(&array,i+j+k,i,j,k);
printf("Dim: %d :\n",array.dim);
printf("bounds->[");
for(i=0;i<array.dim;i++){
printf("%d",array.bounds[i]);
if(i<array.dim-1) printf(",");
}
printf("]\n");
for(i=0;i<array.bounds[0];i++){
for(j=0;j<array.bounds[1];j++){
for(k=0;k<array.bounds[2];k++){
Value(array,&temp,i,j,k);
printf("%5d",temp);
}
printf("\n");
}
printf("\n");
}
DestroyArray(&array);
}
相关文章: