数据结构5.1_数组的定义、顺序表示及实现
数据结构中最基本的一个结构就是线性结构,而线性结构又分为连续存储结构和离散存储结构。所谓的连续存储结构其实就是数组。
数组的基本操作:
初始化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
知行合一