數(shù)據(jù)結(jié)構(gòu)數(shù)組順序存儲(chǔ)詳細(xì)介紹-創(chuàng)新互聯(lián)

數(shù)據(jù)結(jié)構(gòu) 數(shù)組順序存儲(chǔ)

創(chuàng)新互聯(lián)專(zhuān)注于隨縣企業(yè)網(wǎng)站建設(shè),響應(yīng)式網(wǎng)站建設(shè),成都商城網(wǎng)站開(kāi)發(fā)。隨縣網(wǎng)站建設(shè)公司,為隨縣等地區(qū)提供建站服務(wù)。全流程按需制作網(wǎng)站,專(zhuān)業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,創(chuàng)新互聯(lián)專(zhuān)業(yè)和態(tài)度為您提供的服務(wù)

         最近學(xué)習(xí)數(shù)據(jù)結(jié)構(gòu),看到數(shù)組順序存儲(chǔ),很是頭昏,看不懂,很多東西,這里在網(wǎng)上找了比較詳細(xì)的資料,大家好好看注釋內(nèi)容:

#include<stdarg.h>  
#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<dim;++i){
 A.bounds[i]=va_arg(ap,int);//從這里可以看出,A.bounds數(shù)組中,存放的是各維的大小
 if (A.bounds[i]<0) return UNDERFLOW;
 elemtotal * = A.bounds[i];//各維數(shù)之積,自然是數(shù)組中元素的總個(gè)數(shù)
}
va_end(ap);
A.base=(ElemType *)malloc(elemtotal *sizeof(ElemType));//這個(gè)就是“多維數(shù)組”的存儲(chǔ)本質(zhì):一維數(shù)組!
//用一維方式表示多維數(shù)組后(其實(shí),從管理和使用的角度看,內(nèi)存就只有一維這么一種形式),存在如何按“多維”的邏輯角度定位元素的問(wèn)題。再說(shuō)清楚些:假設(shè)前面所講的4維數(shù)組,其元素用下標(biāo)形式表示,范圍為:(0,0,0,0)到(3,4,5,6)。對(duì)于任意下標(biāo)(在有效范圍內(nèi))(i1, i2, i3, i4)所對(duì)應(yīng)的元素,轉(zhuǎn)換到“一維”空間后,其下標(biāo)應(yīng)該是什么?這就是這個(gè)程序后面要處理的主要問(wèn)題。
if (!A.base) exit (OVERFLOW):
//求映象函數(shù)的常數(shù)ci(i為下標(biāo)),并存入A.constants[i-1],i=1,...dim。
A.constants=(int *)malloc(dim *sizeof(int));
if (!A.constants)exit (OVERFLOW);
//以前面的4維數(shù)組為例子,其中A.bounds[0]=4,A.bounds[1]=5,A.bounds[2]=6,A.bounds[3]=7。
//跟蹤下面的程序:
A.constants[dim-1]=1;//A.constants[3] = 1
for (i=dim-2;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.dim;++i){
 ind=va_arg(ap,int);
 if (ind<0 || ind>=A.bounds[i]) return OVERFLOW;
 off + = A.constants[i] * ind;
 }
 return OK;

另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)建站muchs.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線(xiàn),公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性?xún)r(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿(mǎn)足用戶(hù)豐富、多元化的應(yīng)用場(chǎng)景需求。

網(wǎng)站名稱(chēng):數(shù)據(jù)結(jié)構(gòu)數(shù)組順序存儲(chǔ)詳細(xì)介紹-創(chuàng)新互聯(lián)
路徑分享:http://muchs.cn/article46/dhshhg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供微信公眾號(hào)軟件開(kāi)發(fā)、建站公司服務(wù)器托管、品牌網(wǎng)站設(shè)計(jì)、網(wǎng)站策劃

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

小程序開(kāi)發(fā)