本文目的是通过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 ;
}