數(shù)據(jù)結(jié)構(gòu) 數(shù)組順序存儲(chǔ)
創(chuàng)新互聯(lián)建站成都企業(yè)網(wǎng)站建設(shè)服務(wù),提供成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作網(wǎng)站開(kāi)發(fā),網(wǎng)站定制,建網(wǎng)站,網(wǎng)站搭建,網(wǎng)站設(shè)計(jì),響應(yīng)式網(wǎng)站設(shè)計(jì),網(wǎng)頁(yè)設(shè)計(jì)師打造企業(yè)風(fēng)格網(wǎng)站,提供周到的售前咨詢(xún)和貼心的售后服務(wù)。歡迎咨詢(xún)做網(wǎng)站需要多少錢(qián):18980820575
最近學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu),看到數(shù)組順序存儲(chǔ),很是頭昏,看不懂,很多東西,這里在網(wǎng)上找了比較詳細(xì)的資料,大家好好看注釋內(nèi)容:
#include#define MAX_ARRAY_DIM 8 //假設(shè)數(shù)組維數(shù)的最大值為8 typedef struct { ElemType *base; //數(shù)組元素基址,由InitArray分配 int dim; //數(shù)組維數(shù) int *bounds; //數(shù)組維界基址,由InitArray分配 int *constants; //數(shù)組映象函數(shù)常量基址,由InitArray分配 }Array; Status InitArray(Array &A,int dim,...){//這里用的是“可變參”形參方式。它主要解決維數(shù)不定的問(wèn)題。 //舉例:設(shè)有4維數(shù)組,各維分別是:4,5,6,7(這些數(shù)字是隨意給的),那么,調(diào)用方式: //InitArray(ar, 4, 4, 5, 6, 7); //ar其中,ar也是假設(shè)的變量名稱(chēng), 4表示數(shù)組有4維, 4, 5, 6, 7這4個(gè)數(shù)是各維大小 //如果是5維的,那么就這樣: //InitArray(ar, 5, 第一維數(shù),第二維數(shù),第三維數(shù),第四維數(shù),第五維數(shù)); //若維數(shù)dim和隨后的各維長(zhǎng)度合法,則構(gòu)造相應(yīng)的數(shù)組A,并返回OK。 if (dim<1 ||dim>MAX_ARRAY_DIM) return ERROR; A.dim=dim; A.bounds=(int *)malloc(dim*sizeof(int)); if (!A.bounds) exit(OVERFLOW); //若各維長(zhǎng)度合法,則存入A.bounds,并求出A的元素總數(shù)elemtotal。 elemtotal=1; va_start(ap,dim); //ap為va_list類(lèi)型,是存放變長(zhǎng)參數(shù)表信息的數(shù)組。 for (i=0;i =0;--i)//A.constants[2] = 7,A.constants[1] = 6*7,A.constants[0] = 5*6*7 A.constants[i]=A.bounds[i+1] * A.constants[i+1]; //說(shuō)到這里,這個(gè)問(wèn)題就清晰了:A.constants中的元素,是幫助定位用的。比如說(shuō):對(duì)于(2,0,0,0)這個(gè)下標(biāo)的元素,應(yīng)該越過(guò)前面的(0,0,0,0)~(0,4,5,6)和(1,0,0,0)~(1,4,5,6)這兩大塊,而這兩大塊中的每一塊都有5*6*7個(gè)元素,這正好就是A.constants[0]中所存放的數(shù)據(jù)?。?//現(xiàn)在應(yīng)該明白了吧! return OK; } status Locate(Array A,va_list ap,int &off){ //若ap指示的各下標(biāo)值合法,則求出該元素在A中相對(duì)地址off。 off=0; for (i=0;i =A.bounds[i]) return OVERFLOW; off + = A.constants[i] * ind; } return OK;
補(bǔ)充:為什么A.constants[dim-1]
bounds存的就是每一維里面的個(gè)數(shù),constants保存的是每一個(gè)維度如果下標(biāo)增加1,那個(gè)對(duì)應(yīng)到內(nèi)存空間的下標(biāo)應(yīng)該增加多少。說(shuō)起來(lái)比較抽象,我們假設(shè)是3維,就比較容易說(shuō)清楚了,首先把3維看作有bounds[0]那么高,對(duì)于每一個(gè)0到bounds[0]-1的范圍內(nèi),就是一個(gè)平面,這個(gè)平面有bounds[1]那么長(zhǎng),bounds[2]那么寬。那么,我們把高=0,長(zhǎng)=0,寬=0對(duì)應(yīng)到內(nèi)存的第一個(gè)位置,高=0,長(zhǎng)=0,寬=1的對(duì)應(yīng)到第二個(gè)位置,那么高=0,長(zhǎng)=1,寬=0應(yīng)該放在什么位置呢?顯然就是0+bounds[2]這個(gè)位置。那么高=1,長(zhǎng)=0,寬=0的那個(gè)元素應(yīng)該在哪個(gè)位置呢?顯然是高=0這一個(gè)平面放完了之后的那個(gè)位置,高=0這個(gè)平面有長(zhǎng)度*寬度那么多個(gè)元素,也就是bounds[1]*bounds[2]這么多個(gè)元素,所以高=1,長(zhǎng)=0,寬=0這個(gè)元素就應(yīng)該在0+bounds[1]*bounds[2]這個(gè)位置,對(duì)吧。假設(shè)還有第四維度,我們假設(shè)這個(gè)維度代表時(shí)間吧,那時(shí)間=0,高=0,長(zhǎng)=0,寬=0的元素放在內(nèi)存第0個(gè)位置,那么時(shí)間=1,高=0,長(zhǎng)=0,寬=0的元素是不是應(yīng)該放在0+bound[1]*bound[2]*bound[3]這個(gè)位置呢。這就是A.constants[i]=A.bounds[i+1] * A.constants[i+1];這個(gè)公式的來(lái)歷。當(dāng)然,我只是很簡(jiǎn)單的解釋了,很多細(xì)節(jié)需要你自己考慮,因?yàn)檎Z(yǔ)言表示起來(lái)太復(fù)雜了,不知道怎么表述。。。
其實(shí)你仔細(xì)看A.constants[i]=A.bounds[i+1] * A.constants[i+1];,這是一個(gè)遞推公式,把它展開(kāi)的話(huà),下面我就把constants[i]簡(jiǎn)寫(xiě)為coni,bounds[i]簡(jiǎn)寫(xiě)為boni那么con i= bon[i+1]*con[i+1]=bon[i+1]*bon[i+2]*con[i+2] = bon[i+1]*bon[i+2]*bon[i+3]*con[i+3]=bon[i+1]*bon[i+2]*bon[i+3]*...*bon[dim]你看這個(gè)公式是不是就是相當(dāng)于上面說(shuō)的高度*長(zhǎng)度*寬度? 剛才那個(gè)bon[dim]應(yīng)該寫(xiě)成bon[dim-1]不過(guò)這個(gè)不影響理解。
然后我們看最后一維,例如上面例子的寬度,寬度+1是不是就正好內(nèi)存地址+1呢?于是對(duì)應(yīng)寬度這個(gè)最后的維度,每次地址只需+1就能訪問(wèn)下一個(gè)元素,因此bon[dim-1]也就是最后一維的,是不是就應(yīng)該等于1呢。。
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!