數據結構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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM