数据结构数组

#include <stdio.h>
#include <stdarg.h>

static const int  MAX_DIM = 100;
typedef int element;
typedef struct {element *base; int dim; int *bounds;int *constants;} array;

void init(array * , int , ...);
void destory(array *);
int locate(array * , va_list );
element value(array * , ... );
void assign(array * , element , ...);

int main()
{
 array arr;
 init(&arr , 2 , 3 , 4 );
 assign(&arr , 3 , 1 , 1);
 assign(&arr , 4 , 2 , 2);
 printf("%d\n" , value(&arr , 1 , 1) );
 printf("%d\n" , value(&arr , 2 , 2) );
 getchar();
 return 0;
}

void init(array *arr ,int dim , ...)
{
 va_list ap;
 if(dim < 1 || dim > MAX_DIM) { printf("error dim");getchar();}
 arr->dim = dim;
 arr->bounds = (int *)malloc(dim * sizeof(int));
 //
 int ele_total = 1;
 va_start(ap,dim);
 int i;
 for(i=0 ; i<dim ; i++ )
 {
  *(arr->bounds+i) = va_arg(ap , int);
  if( *(arr->bounds+i) < 0 )
  {
   printf("error bounds");
   getchar();
  }
  ele_total *= *(arr->bounds+i);
 }
 arr->base = (element *)malloc(ele_total * sizeof(element));
 arr->constants = (int *)malloc(dim * sizeof(int));
 *( arr->constants+(dim-1) ) = 1;
 for (i = dim -2 ; i >= 0 ; --i)
 {
  *( arr->constants+i ) = (*( arr->bounds+i+1 )) * (*( arr->constants+i+1 ));
 }
}

void destory(array *arr)
{
 free(arr->base);
 free(arr->bounds);
 free(arr->constants);
}

int locate(array *arr , va_list ap )
{
 int off =0;
 int i;
 int ind;
 for(i = 0 ; i < arr->dim ; ++i)
 {
  ind = va_arg(ap , int );
  if(ind < 0 || ind >= *(arr->bounds+i) )
         return -1;
  off += (*(arr->constants+i)) * ind; 
 }
 return off;
}

element value(array *arr , ... )
{
 va_list ap;
 va_start(ap,arr);
 return *(arr->base + locate(arr , ap));
}

void assign(array *arr , element e , ...)
{
 va_list ap;
 va_start(ap,e);
 *(arr->base + locate(arr , ap)) = e ;


数组的维度全是顺序线性表模拟出来的,分成很多小段,维度增加,继续分成更小的段

所以数组的存取就是对这些段的管理。


void init(array *arr ,int dim , ...)里:

arr->bounds 表示每个维度含有多少它下一级的维度元素

arr->base 表示该线性表的起始地址

ele_total 表示一共有多少基本元素,即element ,所以就拿arr->bounds一直乘

arr->constants 表示纬度单位含有基本元素的个数,主要是方便寻址,因为最大的纬度就是基本元素,所以是倒着计算。


int locate(array *arr , va_list ap )函数:

就是把你输入的 1,2,3的寻址方式转换为线性表的寻址方式,在下面assign 和 value 中都要到了。


上面的示例为2维,如果你喜欢,可以最多定义100维,


  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值