數據結構中最基本的一個結構就是線性結構,而線性結構又分為連續存儲結構和離散存儲結構。所謂的連續存儲結構其實就是數組。
數組的基本操作:
初始化InitArray、銷毀數組DestroyArray、取值Value、賦值Assign;
數組一旦被定義,它的維數和維界就不再改變。
因此,除了結構的初始化和銷毀之外,數組只有存取元素和修改元素值的操作。
一旦建立了數組,則結構中的數據元素個數和元素之間的關系就不再發生變動。
因此采用順序存儲結構表示數據就是自然的事了。
存儲單元事一維的結構,而數組是個多維的結構,則用一組連續存儲單元存放數組的數據元素就有個次序約定問題。
對於二維數組有兩種存儲方式:1)以列序為主序的存儲方式;2)以行序為主序的存儲方式;
C語言中使用的是以行序為主序的存儲方式;
一旦確定了它的維數,各維的長度,便可為它分配存儲空間。
反之,只要給出一組下標便可求得相應數組元素的存儲位置。
---------數組的順序存儲表示---------
---------基本操作的函數原型說明---------
---------基本操作的算法描述---------
1 定義一個n維數組; 2 #include<stdarg.h> //解決不確定參數函數問題,標准頭文件,提供va_start,va_arg,va_end 3 //用於存儲函數的變長參數,參數不確定的函數 4 5 #define MAX_ARRAY_DIM 8 //數組維數的最大值 6 7 typedef struct{ 8 ElemType *base; 9 //數組元素基址,由InitArray分配 10 11 int dim; 12 //數組的維數,一維or二維 13 14 int * bounds; 15 //數組維界基址,由InitArray分配,存儲各維的長度的數組 16 17 int * constants; 18 //數組映像函數常量基址,其實就是ci,確切說的是幾個存儲單元。 19 20 }Array; 21 22 Status InitArray(Array &A, int dim, ...) 23 { 24 if(dim<1||dim>MAX_ARRAY_DIM) return ERROR; 25 A.dim = dim; 26 A.bounds = ()malloc(dim*sizeof()); 27 if(!A.bounds) exit(OVERFLOW); 28 29 //若各維長度合法,則存入A.bounds,並求出A的元素總數elemtotal 30 elemtotal =1; 31 va_start(ap,dim); 32 for(i=0; i<dim; ++i) 33 { 34 A.bounds[i]=va_arg(ap,int); //取出各維的長度 35 if(A.bounds[i]<0) return UNDERFLOW; 36 elemtotal *= A.bounds[i]; 37 } 38 va_end(ap); 39 //以上步驟求整個n維數組的元素個數; 40 41 A.base = (ElemType *)malloc(elemtotal*sizeof(ElemType)); 42 if(!A.base) exit(OVERFLOW); 43 44 A.constants = (int *)malloc(dim *sizeof(int)); 45 if(!A.constants) exit(OVERFLOW); 46 47 A.constants[dim-1]=1; //存儲單元大小為L,0為基,這里指的是cn=L, 48 for(i=dim-2; i>=0; --i) //減序 49 { 50 A.constants[i]=A.bounds[i+1]*A.constants[i+1]; 51 } 52 return OK; 53 } 54 55 Status DestroyArray(Array &A){ //銷毀數組 56 if(!A.base) return ERROR; 57 free(A.base); A.base=NULL; //防止野指針 58 if(A.bounds) return ERROR; 59 free(A.bounds); A.bounds=NULL; 60 if(A.constants) return ERROR; 61 free(A.constants); A.constants=NULL; 62 } 63 64 //定位某個位置合法與否,且返回相對地址off 65 Status Locate(Array A, va_list ap, int &off) 66 { 67 off=0; 68 for(i=0;i<A.dim;++i) 69 { 70 ind = va_arg(ap,int); 71 if(ind<0||ind>=A.bounds[i]) return OVERFLOW; 72 off += A.constants[i] * ind; //其實就是ci*ji 級數 73 } 74 return OK 75 76 } 77 78 //從某個位置取值 79 Status Value(Array A, ElemType &e, ...){ 80 //A是n維數組,e為元素變量,隨后是n個下標值 81 //若各下標不超界,則e賦值為所指定位置的A的元素值,並返回OK 82 va_start(ap,e); 83 if((result=Locate(A,ap,off))<=0) return result; 84 e = *(A.base+off); 85 return OK; 86 87 } 88 89 //給某個位置賦值 90 Status Assign(Array A, ElemType e, ...){ 91 //A是n維數組,e為元素變量,隨后是n個下標值 92 //若下標不超界,則將e的值賦給指定的A的元素,並返回OK 93 va_start(ap,e); 94 if((result=Locate(A,ap,off))<=0) return result; 95 *(A.base+off)=e; 96 return OK; 97 }
相關鏈接:
數據結構之數組定義及基本操作:https://www.cnblogs.com/WuNaiHuaLuo/p/4826512.html
