다 차원 배열 의 실현

배열 이 정의 되면 그 차원 과 차원 은 변 하지 않 는 다.따라서 구조의 초기 화 와 폐 기 를 제외 하고 배열 은 액세스 요소 와 수정 요소 만 있 습 니 다.배열 은 일반적으로 줄 순서 와 열 허 로 나 뉜 다.일반 시스템 은 모두 사용 하 는 것 이다.
2 차원 배열 a [m] [n] 을 예 로 들 면
열 순서:
a[0][0]  a[1][0] ...... a[m-1][0]
.............
a[m-1][0] a[m-1][1] ...... a[m-1][n-1]
줄 순서:
a[0][0]  a[1][0] ...... a[m-1][0]
.............
a[0][n-1] a[1][ [n-1 ] ...... a[m-1][n-1]
데 이 터 는 일반적으로 연속 적 인 주소 로 저 장 됩 니 다. 계산 방법 은 (i, j) = & a + (b) + j; / b 1 차원 요소 의 개수 입 니 다.
다 차원 배열 에 보급 (j1, j2, j3,..., jn) = (b2 * b3 *... * bn * j1 + b3 * b4 *... * bn * j2 +... + bn * jn - 1 + jn)
예 를 들 어 배열 a [5] [4] [10] 을 알 고 있 습 니 다. a [2] [3] [4] 의 주 소 를 구 합 니 다.
j1=2、j2 = 3、j3 = 4;b1=5、b2=4、b3=10;
a[2][3][4]=b2*b3*j1+b3*j2+j3=4*10*2+10*3+4;
다음은 코드 구현 입 니 다. (아래 코드 는 제 가 ubuntu 에서 간단하게 테스트 를 통 과 했 습 니 다. 다른 시스템 에서 실행 할 수 없다 면 양해 해 주 십시오. 이 코드 는 간단 한 테스트 만 거 쳤 습 니 다. 문제 가 발생 하면 양해 해 주 십시오.)
/*
*created by Reage at 2013 March 28
*description:      ,    、  、  、  
*
*blog:http://blog.csdn.net/rentiansheng
*/
#include 
#include 
#include 


#define MAXDIM 4

typedef struct Array
{
    int dim;
    int *ptr;
    int *bounds;
    int *base_add;
}Array;

int array_init(Array *a, int dim, ...);
int array_set_value(Array *a, int value, ...);
int array_print_line(Array *a);
int array_get_value(Array *a, ...);
void array_destory(Array *a);

int main(int argc, char *argv[])
{
    Array a;
    int i = 0;
    int j;
    int total = 1;
    array_init(&a, 2, 4, 6);
    
    for(; i < 4; i++)
    {
        for(j = 0; j < 6; j++)
        {
            array_set_value(&a, total++, i, j);
        }
    }

    array_print_line(&a);
    for(i = 0; i < 4; i++)
    {
        for(j = 0; j < 6; j++)
        {
            printf("%-7d",array_get_value(&a,  i, j));
        }
        printf("
"); } array_destory(&a); } int array_init(Array * a, int dim, ...) { if(1 > dim || 8 < dim) return -1; a->dim = dim; va_list ap; int i; long total = 1; a->bounds = (int *)malloc(dim * sizeof(int)); va_start(ap, dim); for(i = 0; i < dim; i++) { a->bounds[i] = va_arg(ap, int); total *= a->bounds[i]; } va_end(ap); a->ptr = (int *) malloc(total * sizeof(int)); a->base_add = (int *) malloc(dim * sizeof(int)); a->base_add[dim -1] = 1; i = dim -2; for(; i >= 0; i--) { a->base_add[i] = a->base_add[i+1] * a->bounds[i+1]; } return 0; } #define FREE(x) if(NULL != (x)) free(x) void array_destory(Array *a) { FREE(a->ptr); FREE(a->bounds); FREE(a->base_add); } int array_get_value(Array *a, ...) { va_list va; va_start(va, a); int result = array_get_locate(a, va); if(-1 == result) return -1; return a->ptr[result]; } int array_print_line(Array *a) { int total = 1; int i = 0; int line ; for(; i < a->dim; i++) { total *= a->bounds[i]; } line = total/a->bounds[0]; for(i = 0; i < total; i++) { if(0 == i % line && 0 != i) printf("
"); printf("%-7d", a->ptr[i]); } printf("
"); return 0; } int array_get_locate(Array *a, va_list va) { int result = 0; int bound; int i; for(i = 0; i < a->dim; i++) { bound = va_arg(va, int); if(0 > bound || bound > a->bounds[i]) { return -1; } result += bound * a->base_add[i]; } return result; } int array_set_value(Array *a, int value, ...) { if(NULL == a) return -1; va_list va; va_start(va, value); int result = array_get_locate(a, va); if( -1 == result) return -1; a->ptr[result] = value; return 0; }

blog: http://blog.csdn.net/rentiansheng/article/details/8737225

좋은 웹페이지 즐겨찾기