C语言多维数组的存储表示和实现

/*
 * 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 <stdarg.h>
 * 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 <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
#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 <stdio.h>
#include <stdlib.h>
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	







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值