概述
#include<stdarg.h>
//标准头文件,提供宏va_start、va_arg、va_end
#include<stdlib.h>
#include<stdio.h>
#define MAX_ARRAY_DIM 8
//假设数组维数的最大值为8
#define OVERFLOW -2
#define UNDERFLOW -3
#define ERROR 0
#define OK 1
typedef int Status;
typedef struct
{
int *base;
//数组元素基址,假设数组类型为int
int dim;
//数组维数
int *bounds;
//数组维界基址
int *constants;
//数组映射函数常量基址
}Array;
Status InitArray(Array *A,int dim,...);
Status Locate(Array A,va_list ap,int *off);
Status Assign(Array *A,int e,...);
Status DestroyArray(Array *A);
void main()
{
//int off;
//va_list ap;
int e;
Array array,*arr=&array;
InitArray(arr,2,1,2);
Assign(arr,1,2,3);
Value(array,&e);
printf("%d",e);
getchar();
getchar();
}
Status InitArray(Array *A,int dim,...)
{
int elemtotal,i;
va_list ap;
if (dim<1||dim>MAX_ARRAY_DIM)
//判断维数是否在限制之内。如果不在之内,则返回错误
{
return ERROR;
}
A->dim=dim;
//数组标识维数信息
if (!(A->bounds=(int *)malloc(dim*sizeof(int))))
//动态分配维数的大小。返回维数的首地址
{
exit(OVERFLOW);
}
elemtotal=1;
va_start(ap,dim);
//存放变长参数表信息的数组。
for(i=0;i<dim;i++)
{
A->bounds[i]=va_arg(ap,int);
if (A->bounds[i]<0)
{
return UNDERFLOW;
}
elemtotal*=A->bounds[i];
}
va_end(ap);
if(!(A->base=(int*)malloc(elemtotal*sizeof(int))))
{
exit(OVERFLOW);
}
if (!(A->constants=(int *)malloc(dim*sizeof(int))))//求映像函数的常数ci,并存入A->constants[i-1],i=1,...,dim;
{
exit(OVERFLOW);
}
A->constants[dim-1]=1;
for (i = dim-2; i>0; --i)
{
A->constants[i]=A->bounds[i+1]*A->constants[i+1]; //ci=b(i+1)*c(i+1)
}
return OK;
}
Status Locate(Array A,va_list ap,int *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 OVERFLOW;
}
*off+=A.constants[i]*ind;
}
return OK;
}
Status Assign(Array *A,int e,...)
{
int result,off;
va_list ap;
va_start(ap,e);
if ((result=Locate(*A,ap,&off))<=0)
{
return result;
}
*(A->base+off)=e;
return OK;
}
Status Value(Array A,int *e,...)
{
va_list ap;
int off,result;
va_start(ap,e);
if ((result=Locate(A,ap,&off))<=0)
{
return result;
}
*e=*(A.base+off);
}
Status DestroyArray(Array *A)
{
if (!A->base)
{
return ERROR;
}
free(A->base);
A->base=NULL;
if (!A->bounds)
{
return ERROR;
}
A->bounds=NULL;
free(A->bounds);
if (!A->constants)
{
return ERROR;
}
free(A->constants);
A->constants=NULL;
}
最后
以上就是孤独咖啡为你收集整理的c语言版数据结构(奇迹冬瓜)-数组和广义表(多维数组的基本操作)的全部内容,希望文章能够帮你解决c语言版数据结构(奇迹冬瓜)-数组和广义表(多维数组的基本操作)所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复