数据结构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

 

posted @ 2019-02-18 15:05  Grooovvve  阅读(2258)  评论(0编辑  收藏  举报