数组的顺序表示和实现

来源:互联网 发布:百度知道软件下载 编辑:程序博客网 时间:2024/05/17 03:40

这个就不必纠结了,我个人觉得使用这个数据类型还不如直接使用多维数组方便,有兴趣的童鞋可以看看下面的代码


#include "stdio.h"  

#include "stdarg.h"//标准的都文件,提供va_start,va_arg,va_end,用于存储变长的参数  
#define MAX_LENGH 8//规定数组的最大的维数  
#include "stdlib.h"  
typedef int Status;  
  
typedef int ElemType;  
#define OK 1  
#define ERROR -1  
typedef struct {  
    ElemType * base;//数组的首地址,用一组连续的地址表示  
    int dim;//存发的是数组的维数  
    int *bounds;//数组的维数的基地址  
    int *constants;//数组映像函数常量基地址  
}Array;  
  
  
Status InitArray (Array *arr,int dim,...) {  
    int i;    
    va_list list;  
    int total = 1;//表示的是数组中元素的个数  
    arr->dim = dim;  
    va_start(list,dim);  
    arr->bounds = (int*)malloc( dim * sizeof(int));  
    for (i = 0;i < dim;i++) {  
        arr->bounds[i] = va_arg (list,int);  
        total = total * arr->bounds[i];  
    }  
    arr->base = (ElemType *)malloc(total * sizeof (ElemType));  
    va_end (list);  
    arr->constants = (int *)malloc((dim - 1) * sizeof(int));//实际上保存的是每一位的步进的长度,就是指针加上1时,指针应该指示的地址。  
    arr->constants[dim - 1] = 1;  
    for (i = dim - 2;i >=0;--i) {  
        arr->constants[i] = arr->bounds[i + 1] * arr->constants[i + 1];//  
    }  
    return  OK;  
}  
  
Status destroyArray (Array *arr) {  
    if (arr->base) {  
        free(arr->base);  
        arr->base = NULL;  
    }  
    if (arr->bounds) {  
        free(arr->bounds);  
        arr->bounds = NULL;  
    }  
    if (arr->constants) {  
        free (arr->constants);  
        arr->constants = NULL;  
    }  
    arr->dim = 0;  
    return OK;  
}  
  
//不知在主函数中调用的,但是因为下面的value和Assign都要用到类似的定位,所以提取出来  
Status Locate (Array *arr,va_list list,int *off) {//根据相应的哦list指向的值得出在arr->base指向的相对的位置  
    int i;  
    int temp;  
    *off = 0;//相对于基地址的偏移量  
    for (i = 0;i < arr->dim;i++) {  
        temp = va_arg (list,int);  
        if (temp < 0 || temp >= arr->bounds[i]) {  
            return ERROR;  
        }  
        *off += temp * arr->constants[i];  
    }  
    return OK;  
}  
  
  
  
Status Assign (Array *arr,ElemType e,...) {  
    va_list list;  
    Status result;  
    int off;  
    va_start (list,e);  
    result = Locate(arr,list,&off);  
    if (result == ERROR) {  
            return ERROR;  
    }else {  
        *(arr->base + off) = e;  
    }  
    va_end (list);  
    return OK;  
}  
  
int Value (Array *arr,ElemType *e,...) {  
    va_list list;  
    int result;  
    int off;  
    va_start (list,e);  
    result = Locate(arr,list,&off);  
    if (result == ERROR) {  
        return ERROR;  
    }else {  
        *e = *(arr->base + off );  
        return OK;  
    }  
}  
  
int main () {  
    Array arr;  
    int i;  
    int j;  
    int k;  
    int count = 0;  
    int temp;  
    InitArray(&arr,3,3,4,2);  
    for (i = 0;i < 3;i++) {  
        for (j = 0;j < 4;j++) {  
            for (k = 0;k < 2;k++) {  
                Assign (&arr,count++,i,j,k);  
            }  
        }  
    }  
      
      
    for (i = 0;i < 3;i++) {  
        for (j = 0;j < 4;j++) {  
            for (k = 0;k < 2;k++) {  
                Value (&arr,&temp,i,j,k);  
                printf("%d ",temp);  
            }  
        }  
    }  
    return 0;  
}  
原创粉丝点击