本文目的是通过C语言的结构体和动态数组,实现自定义类型的三维数组TripleArray及其基本运算
#include<iostream>
using namespace std;
typedef struct triplearray{
int m1;
int m2;
int m3;
int *array;
}TripleArray;
#define ERROR 0
#define OK 1
#define NotPresent 2
#define Duplicate 3
#define IllegalIndex 4
typedef int Status;
Status CreateArray(TripleArray *TripleArray, int m1, int m2, int m3) {
TripleArray->m1 = m1;
TripleArray->m2 = m2;
TripleArray->m3 = m3;
TripleArray->array = (int *)malloc(m1 * m2 * m3 * sizeof(int));
if( !(TripleArray->array) )
return ERROR;
else
return OK;
}
Status DestroyArray(TripleArray *TripleArray) {
if(!(TripleArray->array))
return ERROR;
else {
free(TripleArray->array);
}
free(TripleArray);
return OK;
}
Status RetrieveArray(TripleArray TripleArray, int i1, int i2, int i3, int *x) {
if(!TripleArray.array)
return NotPresent;
if(i1 < 0 || i2 < 0 || i3 < 0 ||
i1 >= TripleArray.m1 || i2 >= TripleArray.m2 || i3 >= TripleArray.m3)
return IllegalIndex;
*x = *(TripleArray.array + i1 * TripleArray.m2 * TripleArray.m3 + i2 * TripleArray.m3 + i3);
return OK;
}
Status StoreArrayItem(TripleArray *TripleArray, int i1, int i2, int i3, int x) {
if(!TripleArray->array)
return NotPresent;
if(i1 < 0 || i2 < 0 || i3 < 0 ||
i1 >= TripleArray->m1 || i2 >= TripleArray->m2 || i3 >= TripleArray->m3)
return IllegalIndex;
*(TripleArray->array + i1 * TripleArray->m2 * TripleArray->m3 + i2 * TripleArray->m3 + i3) = x;
return OK;
}
void OutputArray(TripleArray TripleArray) {
if(!TripleArray.array)
return ;
for(int i = 0; i < TripleArray.m1; i++) {
for(int j = 0; j < TripleArray.m2; j++) {
for(int k = 0; k < TripleArray.m3; k++) {
int value;
RetrieveArray(TripleArray, i, j, k, &value);
printf("Array[%d][%d][%d] = %d\n", i, j, k, value);
}
}
}
printf("\n");
}
Status CopyArray(TripleArray *TripleArrayA, TripleArray *TripleArrayB) {
if(!(TripleArrayA->array || TripleArrayB->array))
return NotPresent;
if (TripleArrayA->array == TripleArrayB->array)
return Duplicate;
if(TripleArrayA->m1 != TripleArrayB->m1 ||
TripleArrayA->m2 != TripleArrayB->m2 ||
TripleArrayA->m3 != TripleArrayB ->m3)
return ERROR;
for(int i = 0; i < TripleArrayA->m1; i++) {
for(int j = 0; j < TripleArrayA ->m2; j++) {
for(int k = 0; k < TripleArrayA->m3; k++) {
int value;
RetrieveArray(*TripleArrayA, i, j, k, &value);
StoreArrayItem(TripleArrayB, i, j, k, value);
}
}
}
return OK;
}
int main() {
TripleArray TripleArrayA, TripleArrayB;
CreateArray(&TripleArrayA, 2, 2, 2);
CreateArray(&TripleArrayB, 2, 2, 2);
for(int i = 0; i < TripleArrayA.m1; i++) {
for(int j = 0; j < TripleArrayA.m2; j++) {
for(int k = 0; k < TripleArrayA.m3; k++) {
StoreArrayItem(&TripleArrayA, i, j, k, 10);
StoreArrayItem(&TripleArrayB, i, j, k, 20);
}
}
}
OutputArray(TripleArrayA);
OutputArray(TripleArrayB);
CopyArray(&TripleArrayA, &TripleArrayB);
OutputArray(TripleArrayA);
OutputArray(TripleArrayB);
system("pause");
return 0;
}