數組的順序存儲
阿新 • • 發佈:2017-11-26
釋放 保存 pan 地址 con div amp print mes
/*#include<stdarg.h>用於獲取不確定個數的參數 數據類型:va_list:用於保存va_arg、va_end所需的信息 提供宏va_start:使va_list指向起始的參數 va_arg:檢索參數 va_end:釋放va_list */ #include<bits/stdc++.h> #define Max_ARRAY_DIM 8 ///假設數組維數最大為8 #define ERROR 0 #define OK 1 #define UNDERFLOW -2 #define OVERFLOW 1 usingnamespace std; typedef int Status; typedef int elemtype; typedef struct { elemtype *base; /// 數組元素的基址,由Init分配 int dim; ///數組維數 int *bounds; ///數組維界基址,由Init分配 int *constants; ///數組映像函數常量基址,由Init分配 }Array; ///若維數 n 和各維長度合法,則構造相應的數組A,並返回OK Status Init(Array &A, int dim,...) {if(dim < 1 || dim > Max_ARRAY_DIM) return ERROR; A.dim = dim; A.bounds = (int *)malloc(dim * sizeof(int)); if(!A.bounds) exit(OVERFLOW); ///若各維長度合法,則存入A.bounds,並求出A的元素總數elemtotal va_list ap; int i,elemtotal = 1; va_start(ap,dim); ///ap為va_list類型,是存放變長參數表信息的數組for(i = 0; i < dim ; i++) { A.bounds[i] = va_arg(ap,int); //printf("A.bounds[%d]------%d\n",i,A.bounds[i]); if(A.bounds[i] < 0) return UNDERFLOW; /* underflow 堆棧下溢,常賦值為負數 原因:指針調用錯誤、系統棧空間過小、指針被錯誤修改 */ elemtotal *= A.bounds[i]; } va_end(ap); A.base = (elemtype*)malloc(elemtotal * sizeof(elemtype)); if(!A.base) exit(OVERFLOW); ///求映像函數的常數Ci,並存入A.constants[i-1],i = 1.....dim A.constants = (int *)malloc(dim * sizeof(int)); if(!A.constants) exit(OVERFLOW); A.constants[dim - 1] = 1; ///L = 1,指針的增減以元素的大小為單位 for(i = dim - 2; i>=0; i--){ A.constants[i] = A.bounds[i+1] * A.constants[i+1]; } return OK; } ///銷毀數組 Status DestroyArray(Array &A) { if(!A.base) return ERROR; free(A.base); A.base = NULL; if (!A.bounds) return ERROR; free(A.bounds); A.bounds = NULL; if (!A.constants) return ERROR; free(A.constants); A.constants = NULL; return OK; } ///若ap指示的各下標值合法,則求出該元素在A中相當地址off Status Locate(Array A, va_list ap, int &off) { off = 0; int i, ind; for(i = 0; i < A.dim; i++) { ind = va_arg(ap,int); if(ind < 0 || ind >= A.bounds[i]) return OVERFLOW; off += A.constants[i]*ind; } return OK; } /* A是n維數組,e為元素變量,後面是n 個下標值。 若各下標不超界,則e被賦值為所指定的A的元素值,並返回OK。 e=A[i1][i2]…[in]; */ Status Value(Array A,elemtype &e,...) { va_list ap; int off,result; va_start(ap,e); if((result = Locate(A,ap,off)) <= 0) return result; e = *(A.base + off); return OK; } /* A是n維數組,e為元素變量,隨後是n 個下標值。 若下標不超界,則將e的值賦給所指定的A的元素,並返回OK。 A[i1][i2]…[in] =e; */ Status Assign(Array &A, elemtype e,...) { va_list ap; int result , off; va_start(ap,e); if((result = Locate(A,ap,off)) <= 0) return result; *(A.base + off) = e; return OK; } int main() { Array a; int i,j,m,n; elemtype x; cin>>m>>n; Init(a,2,m,n); for(i=0;i<m;i++) for (j=0;j<n;j++) Assign(a,(i+1)*(j+1),i,j); for(i=0;i<m;i++) { for (j=0;j<n;j++) { Value(a,x,i,j); cout<<" "<<x; } if( i != m - 1) cout<<‘\n‘; } return 0; }
數組的順序存儲