歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 多維數組的順序表示

多維數組的順序表示

日期:2017/3/1 10:07:55   编辑:Linux編程

多維數組節點,有四個元素
struct array
{
int *base; //存放數組的元素的基地址
int dim; //表示多維數組的維數
int *bounds; //表示每一維的長度
int *constants; //存放數組映象函數常量基址

};

譬如一個2*3的二維數組,dim就等於二,行優先存儲,bounds[0]就為2,bounds[1]就為3。

對於constants,constant[i]就是第i+1層的數組中每一元素(數組)的大小。
對於行主序的2*3的二維數組來說,constant[1]就是每一行的一個元素(如:((a,b,c),(d,e,f))中a,f)占據的內存長度
constant[0]就是當前行每一列(如:(A,B),其中A=(a,b,c),B=(d,e,f)),A、B占據的內存長度。

  1. /*
  2. 多維數組的順序表示
  3. 調試環境:vs2010,gcc
  4. */
  5. #include <stdio.h>
  6. #include <stdarg.h>
  7. #include <stdlib.h>
  8. #include <malloc.h>
  9. #define OK 1
  10. #define ERROR 0
  11. #define MAX_ARRAY_DIM 8
  12. typedef struct
  13. {
  14. int *base; //數組的基地址,初始化時分配
  15. int dim; //數組的維數
  16. int *bounds; //數組每一維的長度
  17. int *constants; //數組映象函數常量基址
  18. }array;
  19. int init_array(array *a, int dim, ...)
  20. {
  21. int i = 0;
  22. int elem_num = 1; //記錄數組中元素的個數
  23. va_list ap = NULL;
  24. if(dim < 1 || dim > MAX_ARRAY_DIM)
  25. {
  26. return ERROR;
  27. }
  28. a->dim = dim;
  29. a->bounds = (int *)malloc(dim * sizeof(int));
  30. if(!(a->bounds))
  31. {
  32. return ERROR;
  33. }
  34. va_start(ap, dim);
  35. for(i = 0; i < dim; i++)
  36. {
  37. a->bounds[i] = va_arg(ap, int);
  38. if(a->bounds[i] < 0)
  39. {
  40. return ERROR;
  41. }
  42. elem_num *= a->bounds[i];
  43. }
  44. va_end(ap);
  45. a->base = (int *)malloc(elem_num * sizeof(int));
  46. if(! (a->base))
  47. {
  48. return ERROR;
  49. }
  50. a->constants = (int *)malloc(dim * sizeof(int));
  51. if(!(a->constants))
  52. {
  53. return ERROR;
  54. }
  55. a->constants[dim - 1] = 1;
  56. for(i=dim-2; i>=0; i--)
  57. {
  58. a->constants[i] = a->constants[i+1] * a->bounds[i+1];
  59. }
  60. return OK;
  61. }
  62. int destory_array(array *a)
  63. {
  64. if(a->base)
  65. {
  66. free(a->base);
  67. a->base = NULL;
  68. }
  69. else
  70. return ERROR;
  71. if(a->bounds)
  72. {
  73. free(a->bounds);
  74. a->bounds = NULL;
  75. }
  76. else
  77. return ERROR;
  78. if(a->constants)
  79. {
  80. free(a->constants);
  81. a->constants = NULL;
  82. }
  83. else
  84. return ERROR;
  85. return OK;
  86. }
  87. /*尋找待搜索的arr[i][j][k]相對於基地址的偏移量*/
  88. int locate_array_elem(array a, va_list ap, int *offset)
  89. {
  90. int i = 0;
  91. int curdim = 0;
  92. for(i = 0; i < a.dim; i++)
  93. {
  94. curdim = va_arg(ap, int);
  95. if(curdim < 0 || curdim >=a.bounds[i])
  96. {
  97. return ERROR;
  98. }
  99. *offset += a.constants[i] * curdim;
  100. }
  101. return OK;
  102. }
  103. int get_array_elem(int *e, array a, ...)
  104. {
  105. va_list ap;
  106. int result = 0;
  107. int offset = 0;
  108. va_start(ap, a);
  109. if(!(result = locate_array_elem(a, ap, &offset)))
  110. {
  111. return ERROR;
  112. }
  113. va_end(ap);
  114. *e = *(a.base + offset);
  115. return OK;
  116. }
  117. int assign_array_elem(int e, array *a, ...)
  118. {
  119. va_list ap;
  120. int result = 0;
  121. int offset = 0;
  122. va_start(ap, a);
  123. if(!(result = locate_array_elem(*a, ap, &offset)))
  124. {
  125. return ERROR;
  126. }
  127. va_end(ap);
  128. *(a->base + offset) = e;
  129. return OK;
  130. }
  131. int main(int argc, char *argv[])
  132. {
  133. array arr;
  134. int dim = 3;
  135. int bound1 = 2, bound2 = 3, bound3 = 4; //arr[2][3][4]數組
  136. int i = 0, j = 0, k = 0;
  137. int assign_elem = 0;
  138. int get_elem = 0;
  139. int *p = NULL;
  140. init_array(&arr, dim, bound1, bound2, bound3);
  141. printf("array.bounds = "); //順序輸出array.bounds
  142. p = arr.bounds;
  143. for(i = 0; i < dim; i++)
  144. {
  145. printf("%d ", *(p + i));
  146. }
  147. printf("\narray.contents = "); //順序輸出array.contents
  148. p = arr.constants;
  149. for(i = 0; i < dim; i++)
  150. {
  151. printf("%d ", *(p + i));
  152. }
  153. printf("\narray[%d][%d][%d] : \n", bound1, bound2, bound3);
  154. for(i = 0; i < bound1; i++)
  155. {
  156. for(j = 0; j < bound2; j++)
  157. {
  158. for(k = 0; k < bound3; k++)
  159. {
  160. assign_elem = i * 100 + j * 10 + k;
  161. assign_array_elem(assign_elem, &arr, i, j, k);
  162. get_array_elem(&get_elem, arr, i, j, k);
  163. printf("array[%d][%d][%d]=%-4d", i, j, k, get_elem);
  164. }
  165. printf("\n");
  166. }
  167. printf("\n");
  168. }
  169. p = arr.base;
  170. for(i = 0; i < bound1 * bound2 * bound3; i++)
  171. {
  172. printf("%-4d", *(p + i));
  173. if(i % (bound2 * bound3) == bound2 * bound3 - 1)
  174. {
  175. printf("\n");
  176. }
  177. }
  178. destory_array(&arr);
  179. return 0;
  180. }
Copyright © Linux教程網 All Rights Reserved