设为首页 加入收藏

TOP

多维数组的实现 (二)
2014-11-23 22:57:38 来源: 作者: 【 】 浏览:3
Tags:多维 实现
问、打印
*
*blog:http://blog.csdn.net/rentiansheng
*/
#include
#include
#include


#define MAXDIM 4

typedef struct Array
{
int dim;
int *ptr;
int *bounds;
int *base_add;
}Array;

int array_init(Array *a, int dim, ...);
int array_set_value(Array *a, int value, ...);
int array_print_line(Array *a);
int array_get_value(Array *a, ...);
void array_destory(Array *a);

int main(int argc, char *argv[])
{
Array a;
int i = 0;
int j;
int total = 1;
array_init(&a, 2, 4, 6);

for(; i < 4; i++)
{
for(j = 0; j < 6; j++)
{
array_set_value(&a, total++, i, j);
}
}

array_print_line(&a);
for(i = 0; i < 4; i++)
{
for(j = 0; j < 6; j++)
{
printf("%-7d",array_get_value(&a, i, j));
}
printf("\n");
}
array_destory(&a);
}

int array_init(Array * a, int dim, ...)
{
if(1 > dim || 8 < dim)
return -1;
a->dim = dim;

va_list ap;
int i;
long total = 1;

a->bounds = (int *)malloc(dim * sizeof(int));

va_start(ap, dim);
for(i = 0; i < dim; i++)
{
a->bounds[i] = va_arg(ap, int);
total *= a->bounds[i];
}
va_end(ap);

a->ptr = (int *) malloc(total * sizeof(int));

a->base_add = (int *) malloc(dim * sizeof(int));
a->base_add[dim -1] = 1;
i = dim -2;
for(; i >= 0; i--)
{
a->base_add[i] = a->base_add[i+1] * a->bounds[i+1];
}

return 0;
}

#define FREE(x) if(NULL != (x)) free(x)

void array_destory(Array *a)
{
FREE(a->ptr);
FREE(a->bounds);
FREE(a->base_add);
}

int array_get_value(Array *a, ...)
{
va_list va;
va_start(va, a);

int result = array_get_locate(a, va);
if(-1 == result) return -1;
return a->ptr[result];
}


int array_print_line(Array *a)
{
int total = 1;
int i = 0;
int line ;
for(; i < a->dim; i++)
{
total *= a->bounds[i];
}

line = total/a->bounds[0];
for(i = 0; i < total; i++)
{
if(0 == i % line && 0 != i) printf("\n");
printf("%-7d", a->ptr[i]);
}
printf("\n");
return 0;
}


int array_get_locate(Array *a, va_list va)
{
int result = 0;
int bound;
int i;
for(i = 0; i < a->dim; i++)
{
bound = va_arg(va, int);
if(0 > bound || bound > a->bounds[i])
{
return -1;
}
result += bound * a->base_add[i];
}
return result;
}

int array_set_value(Array *a, int value, ...)
{
if(NULL == a) return -1;
va_list va;
va_start(va, value);

int result = array_get_locate(a, va);
if( -1 == result) return -1;

a->ptr[result] = value;
return 0;
}

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C语言查遗补缺――关于自增运算符.. 下一篇C语言的学习基础,100个经典的算法

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: