/*
* array.h
*
* Created on: 2011-9-21
* Author:liusheng
*/
/*
* 头文件stdarg.h中几个宏作用的讲解
* va_list args; //声明变量
* va_start(args, before); //开始解析。args指向before后面的参数
* 参数类型 var = va_arg(args, 参数类型);//取下一个参数并返回。args指向下一个参数
* va_end(args); //结束解析
*
* #include
* int arg_test(int a1,...) {
* va_list args;
* int i;
* int arg[5];
*
* va_start(args,a1);
*
* arg[0] = a1;//将参数的个数给arg[0]
* for(i = 1;i < 5;i ++) {
* arg[i] = va_arg(args,int);
* }
*
* va_end(args);
*
* for(i = 0;i < 5;i ++) {
* printf("%d\n",arg[i]);
* }
* }
*/
/*
* 其实多维数组的表示与实现只要理解了那个表示每个数据位置的公式和链表的操作就很简单了
*/
#include
#include
#include
#define ElemType int
#define FALSE 0
#define TRUE 1
#define ARRAY_MAX_SIZE 8
typedef struct {
ElemType *base;
int dim;
int *bounds;//数组维界基址,用于存储维数
int *constants;//数组映象函数地址
}array;
//初始化数组
int initarray(array *a,int dim,...) {
if(dim < 0 || dim > ARRAY_MAX_SIZE) return FALSE;
a->dim = dim;
int i;
int elemsize = 1;
va_list args;
va_start(args,dim);
a->bounds = (int *)malloc(sizeof(int) * dim);
if(a->bounds == NULL) return FALSE;
for(i = 0;i < dim;i ++) {
a->bounds[i] = va_arg(args,int);
elemsize *= a->bounds[i];
}
va_end(args);
a->base = (ElemType *)malloc(sizeof(ElemType) * elemsize);
if(a->base == NULL) return FALSE;
a->constants = (int *)malloc(sizeof(int) * dim);
if(a->constants == NULL) return FALSE;
a->constants[dim - 1] = 1;
for(i = dim -2;i >= 0;i --) {
a->constants[i] = a->constants[i + 1] * a->bounds[i + 1];
}
return TRUE;
}
//向数组中插入数据
int insertelem(array *a,ElemType e,...) {
ElemType *locat;
locat = a->base;
int i;
va_list temp;
va_start(temp,e);
for(i = 0;i < a->dim; i ++) {
locat += va_arg(temp,int) * a->constants[i];
}
va_end(temp);
printf("%d\t",*locat);
*locat = e;
return TRUE;
}
//销毁数组
int destroyarray(array *a) {
if(a->bounds) free(a->bounds);
if(a->base) free(a->base);
if(a->constants) free(a->constants);
return TRUE;
}
/*
* test_arrcy.c
* 测试array.h
* Created on: 2011-9-21
* Author: root
*/
#include "array.h"
#include
#include
int main() {
array a;
initarray(&a,3,2,3,4);
insertelem(&a,888,0,0,0);
insertelem(&a,88,0,0,0);
insertelem(&a,8,1,2,3);
insertelem(&a,88,1,2,3);
return 0;
}
//控制台结果
0 888 0 8