国际惯例,直接上代码
文件multiarray.h存放数据结构体,如下:
#ifndef _MULTIARRAY_H_ #define _MULTIARRAY_H_ #define MAX_DIM 10 #include <stdarg.h> typedef struct _MArray { int *base; //基址 int dim; //维度 int *bounds; //存放没个维度大小的头指针 int *wide; //存放每个维度偏移常量的头指针 }MArray,*pMArray; pMArray init_multi_array(void); int set_multi_array(pMArray pma,int dim,...); void destory_multi_array(pMArray pma); int locate_array_elem(pMArray pma,va_list ap,int *offset) ; int get_array_elem(int* e,pMArray pma,...); int assign_array_elem(int e,pMArray pma,...); #endif
文件multiarray.c存放数据结构实现方法,如下:
/******************************* 时间:2014.12.14 作者:XIAO_PING_PING 编译环境:DEV-C++ 4.9.9.2 内容:多维数组的存储表示与实现 功能:学习些数据结构 ********************************/ #include <string.h> #include <stdlib.h> #include "multiarray.h" /*初始化一个空的数组*/ pMArray init_multi_array(void)/*注意:必须以返回值输出, 否则后面给成员赋值会报错*/ { pMArray pma; pma = (MArray *)malloc(sizeof(MArray)); pma->base = NULL; pma->bounds = NULL; pma->wide = NULL; pma->dim = 0; return pma; } /*设置多维数组*/ int set_multi_array(pMArray p,int dims,...) { int i,elem_num = 1; va_list ap = NULL; if(dims < 1 || dims > MAX_DIM) { return -2; } p->dim = dims; p->bounds = (int *)malloc(dims * sizeof(int)); if(!p->bounds) { return -1; } va_start(ap,dims); for(i = 0;i < dims;i++) { p->bounds[i] = va_arg(ap,int); if(p->bounds[i] < 0) { return -2; } elem_num *= p->bounds[i]; } va_end(ap); p->base = (int *)malloc(elem_num * sizeof(int)); if(p->base == NULL) { return -2; } p->wide = (int *)malloc(dims * sizeof(int)); if(!p->wide) { return -1; } p->wide[dims - 1] = 1; for(i = dims - 2;i >= 0;i--) { p->wide[i] = p->wide[i + 1] * p->bounds[i + 1]; } return 0; } /*摧毁多维数组*/ void destory_multi_array(pMArray pma) { if(NULL != pma->wide) { free(pma->wide); pma->wide = NULL; } if(NULL != pma->bounds) { free(pma->bounds); pma->bounds = NULL; } if(NULL != pma->base) { free(pma->base); pma->base = NULL; } free(pma); } /*定位元素a[i][j][k]...位置*/ int locate_array_elem(pMArray pma,va_list ap,int *offset) { int i; int cur = 0; for(i = 0;i < pma->dim ;i++) { cur = va_arg(ap,int); if(0 > cur || cur > pma->bounds[i]) { return -1; } *offset += pma->wide[i] * cur; } return 0; } /*得到多维数组特定位置的元素*/ int get_array_elem(int* e,pMArray pma,...) { int i; int offset = 0; int ret = 0; va_list ap = NULL; va_start(ap,pma); if(0 != locate_array_elem(pma,ap,&offset)) { return -1; } va_end(ap); *e = *(pma->base + offset); return 0; } /*给多维数组特定位置赋值*/ int assign_array_elem(int e,pMArray pma,...) { int offset = 0; int ret = 0; va_list ap = NULL; va_start(ap,pma); ret = locate_array_elem(pma,ap,&offset); if(ret) { return -1; } va_end(ap); *(pma->base + offset) = e; return 0; }
测试文件test.c
#include <conio.h> #include <stdlib.h> #include <string.h> #include "multiarray.h" int main() { pMArray arr; int dim = 3; int bound1 = 2, bound2 = 3, bound3 = 4; //arr[2][3][4]数组 int i = 0, j = 0, k = 0; int assign_elem = 0; int get_elem = 0; int *p = NULL; arr = init_multi_array(); set_multi_array(arr, dim, bound1, bound2, bound3); printf("array.bounds = "); //顺序输出array.bounds p = arr->bounds; for(i = 0; i < dim; i++) { printf("%d ", *(p + i)); } printf("\narray.contents = "); //顺序输出array.contents p = arr->wide; for(i = 0; i < dim; i++) { printf("%d ", *(p + i)); } printf("\narray[%d][%d][%d] : \n", bound1, bound2, bound3); for(i = 0; i < bound1; i++) { for(j = 0; j < bound2; j++) { for(k = 0; k < bound3; k++) { assign_elem = i * 100 + j * 10 + k; assign_array_elem(assign_elem, arr, i, j, k); get_array_elem(&get_elem, arr, i, j, k); printf("array[%d][%d][%d]=%-4d", i, j, k, get_elem); } printf("\n"); } printf("\n"); } p = arr->base; for(i = 0; i < bound1 * bound2 * bound3; i++) { printf("%-4d", *(p + i)); if(i % (bound2 * bound3) == bound2 * bound3 - 1) { printf("\n"); } } destory_multi_array(arr); getch(); return 0; }
以及运行结果如下:
时间: 2024-11-14 18:41:06