亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > C > 正文

數據結構 數組順序存儲詳細介紹

2020-01-26 14:07:37
字體:
來源:轉載
供稿:網友

數據結構 數組順序存儲

          最近學習數據結構,看到數組順序存儲,很是頭昏,看不懂,很多東西,這里在網上找了比較詳細的資料,大家好好看注釋內容:

#include<stdarg.h>  #define MAX_ARRAY_DIM 8 //假設數組維數的最大值為8 typedef struct { ElemType *base;  //數組元素基址,由InitArray分配 int dim;  //數組維數 int *bounds;  //數組維界基址,由InitArray分配 int *constants;  //數組映象函數常量基址,由InitArray分配}Array;Status InitArray(Array &A,int dim,...){//這里用的是“可變參”形參方式。它主要解決維數不定的問題。//舉例:設有4維數組,各維分別是:4,5,6,7(這些數字是隨意給的),那么,調用方式://InitArray(ar, 4, 4, 5, 6, 7);//ar其中,ar也是假設的變量名稱, 4表示數組有4維, 4, 5, 6, 7這4個數是各維大小//如果是5維的,那么就這樣://InitArray(ar, 5, 第一維數,第二維數,第三維數,第四維數,第五維數);//若維數dim和隨后的各維長度合法,則構造相應的數組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);//若各維長度合法,則存入A.bounds,并求出A的元素總數elemtotal。elemtotal=1;va_start(ap,dim); //ap為va_list類型,是存放變長參數表信息的數組。for (i=0;i<dim;++i){ A.bounds[i]=va_arg(ap,int);//從這里可以看出,A.bounds數組中,存放的是各維的大小 if (A.bounds[i]<0) return UNDERFLOW; elemtotal * = A.bounds[i];//各維數之積,自然是數組中元素的總個數}va_end(ap);A.base=(ElemType *)malloc(elemtotal *sizeof(ElemType));//這個就是“多維數組”的存儲本質:一維數組!//用一維方式表示多維數組后(其實,從管理和使用的角度看,內存就只有一維這么一種形式),存在如何按“多維”的邏輯角度定位元素的問題。再說清楚些:假設前面所講的4維數組,其元素用下標形式表示,范圍為:(0,0,0,0)到(3,4,5,6)。對于任意下標(在有效范圍內)(i1, i2, i3, i4)所對應的元素,轉換到“一維”空間后,其下標應該是什么?這就是這個程序后面要處理的主要問題。if (!A.base) exit (OVERFLOW)://求映象函數的常數ci(i為下標),并存入A.constants[i-1],i=1,...dim。A.constants=(int *)malloc(dim *sizeof(int));if (!A.constants)exit (OVERFLOW);//以前面的4維數組為例子,其中A.bounds[0]=4,A.bounds[1]=5,A.bounds[2]=6,A.bounds[3]=7。//跟蹤下面的程序:A.constants[dim-1]=1;//A.constants[3] = 1for (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];//說到這里,這個問題就清晰了:A.constants中的元素,是幫助定位用的。比如說:對于(2,0,0,0)這個下標的元素,應該越過前面的(0,0,0,0)~(0,4,5,6)和(1,0,0,0)~(1,4,5,6)這兩大塊,而這兩大塊中的每一塊都有5*6*7個元素,這正好就是A.constants[0]中所存放的數據?。?/現在應該明白了吧!return OK;}status Locate(Array A,va_list ap,int &off){//若ap指示的各下標值合法,則求出該元素在A中相對地址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;

補充:為什么A.constants[dim-1]

bounds存的就是每一維里面的個數,constants保存的是每一個維度如果下標增加1,那個對應到內存空間的下標應該增加多少。說起來比較抽象,我們假設是3維,就比較容易說清楚了,首先把3維看作有bounds[0]那么高,對于每一個0到bounds[0]-1的范圍內,就是一個平面,這個平面有bounds[1]那么長,bounds[2]那么寬。那么,我們把高=0,長=0,寬=0對應到內存的第一個位置,高=0,長=0,寬=1的對應到第二個位置,那么高=0,長=1,寬=0應該放在什么位置呢?顯然就是0+bounds[2]這個位置。那么高=1,長=0,寬=0的那個元素應該在哪個位置呢?顯然是高=0這一個平面放完了之后的那個位置,高=0這個平面有長度*寬度那么多個元素,也就是bounds[1]*bounds[2]這么多個元素,所以高=1,長=0,寬=0這個元素就應該在0+bounds[1]*bounds[2]這個位置,對吧。假設還有第四維度,我們假設這個維度代表時間吧,那時間=0,高=0,長=0,寬=0的元素放在內存第0個位置,那么時間=1,高=0,長=0,寬=0的元素是不是應該放在0+bound[1]*bound[2]*bound[3]這個位置呢。這就是A.constants[i]=A.bounds[i+1] * A.constants[i+1];這個公式的來歷。當然,我只是很簡單的解釋了,很多細節需要你自己考慮,因為語言表示起來太復雜了,不知道怎么表述。。。
其實你仔細看A.constants[i]=A.bounds[i+1] * A.constants[i+1];,這是一個遞推公式,把它展開的話,下面我就把constants[i]簡寫為coni,bounds[i]簡寫為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]你看這個公式是不是就是相當于上面說的高度*長度*寬度? 剛才那個bon[dim]應該寫成bon[dim-1]不過這個不影響理解。

然后我們看最后一維,例如上面例子的寬度,寬度+1是不是就正好內存地址+1呢?于是對應寬度這個最后的維度,每次地址只需+1就能訪問下一個元素,因此bon[dim-1]也就是最后一維的,是不是就應該等于1呢。。

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
在线观看视频亚洲| 精品久久中文字幕| 国产精品电影网站| 成人激情在线观看| 欧美成人午夜激情在线| 欧美午夜精品久久久久久人妖| 日韩av影片在线观看| 国产精品视频导航| 亚洲福利视频久久| 国产精品久久久久久久久久小说| 69久久夜色精品国产69| 亚洲美女免费精品视频在线观看| 亚洲成人黄色在线| 久久精品91久久香蕉加勒比| 日本伊人精品一区二区三区介绍| 一区二区三区无码高清视频| 日韩在线视频国产| 欧美国产在线电影| 久热精品视频在线观看一区| 国产精品久久久久久久久粉嫩av| 亚洲精品456在线播放狼人| 精品国产91久久久久久老师| 亚洲性xxxx| 亚洲精品av在线| 国产69精品久久久久99| 日韩电影中文字幕在线观看| 国产精品精品久久久久久| 欧美日韩午夜激情| 久久69精品久久久久久久电影好| 亚洲国产精久久久久久久| 国产精品欧美久久久| 欧美激情第三页| 2019亚洲男人天堂| 国产精品自拍小视频| 日韩欧亚中文在线| 亚洲一区二区中文| 亚洲精品一区二区三区婷婷月| 国产在线视频2019最新视频| 亚洲精品电影网在线观看| 国产成人91久久精品| www日韩中文字幕在线看| 久久久久久综合网天天| 中文字幕国产亚洲2019| 性欧美办公室18xxxxhd| 综合网日日天干夜夜久久| 欧美激情视频在线| 亚洲偷欧美偷国内偷| 国产精品亚洲欧美导航| 九色精品美女在线| 色一情一乱一区二区| 亚洲欧美国产一区二区三区| 国产精品久久久久久久久男| 亚洲免费av网址| 国产精品影片在线观看| 亚洲欧美国内爽妇网| 色妞在线综合亚洲欧美| 日韩免费观看在线观看| 国产精品99久久久久久白浆小说| 成人午夜小视频| 欧美激情一区二区久久久| 69国产精品成人在线播放| 欧美精品videos性欧美| 国产精品99久久久久久www| 日本久久久久久久久久久| 欧美日韩国产丝袜美女| 久久99精品久久久久久青青91| 国产精品美乳在线观看| 成人亚洲综合色就1024| 久久久精品国产一区二区| 欧美电影免费观看高清完整| 欧美激情一区二区久久久| 中文字幕久热精品在线视频| 日韩精品免费在线视频观看| 国产成+人+综合+亚洲欧美丁香花| 国内精品免费午夜毛片| 亚洲国产精品一区二区三区| 亚洲人成电影网站| 另类天堂视频在线观看| 深夜福利日韩在线看| 亚洲欧美中文日韩v在线观看| 亚洲精品白浆高清久久久久久| 中文字幕9999| 成人国内精品久久久久一区| 亚洲激情 国产| 亚洲成人黄色在线观看| 热久久这里只有| 亚洲国产一区二区三区在线观看| 最近2019中文字幕大全第二页| 久久精品99久久久香蕉| 日韩在线观看免费网站| 亚洲欧美一区二区三区情侣bbw| 国产欧美日韩精品专区| 日韩成人xxxx| 国产91在线高潮白浆在线观看| 亚洲国产中文字幕久久网| 国产精品一区二区性色av| 国产欧美精品久久久| 成人在线精品视频| 国产精品99蜜臀久久不卡二区| 亚洲美女精品成人在线视频| 91人人爽人人爽人人精88v| 国产精品国产三级国产专播精品人| 日韩中文字幕视频| 久久中文久久字幕| 欧美精品www| 亚洲欧美在线一区| 欧美性一区二区三区| 欧美日韩国产综合新一区| 黑人狂躁日本妞一区二区三区| 亚洲天堂成人在线| 久久久综合免费视频| 97在线视频免费观看| 91欧美精品午夜性色福利在线| 狠狠爱在线视频一区| 日韩欧美在线视频观看| 亚洲激情在线视频| 国产一区二区三区视频免费| 亚洲第一级黄色片| 国产美女精品视频免费观看| 日韩av电影中文字幕| 狠狠色香婷婷久久亚洲精品| 亚洲免费视频在线观看| 久久人人爽人人爽人人片av高清| 久久久久日韩精品久久久男男| 亚洲欧洲日产国产网站| 亚洲网站在线播放| 国产欧美日韩最新| 亚洲美女在线视频| 4k岛国日韩精品**专区| 日本不卡高字幕在线2019| 国色天香2019中文字幕在线观看| 国产精品日韩精品| 日日狠狠久久偷偷四色综合免费| 亚洲欧美精品一区| 91av在线免费观看视频| 国产精自产拍久久久久久蜜| 亚洲视频免费一区| 国产精品第10页| 国产精品美女免费看| 欧美贵妇videos办公室| 亚洲精品理论电影| 亚洲大尺度美女在线| 亚洲精品wwwww| 久久久国产精品亚洲一区| 91av在线国产| 91精品国产91久久久久| 欧美色欧美亚洲高清在线视频| 国产亚洲aⅴaaaaaa毛片| 亚洲精品中文字幕女同| 亚洲精品小视频| 国产精品99一区| 国产精品美女久久| 成人午夜在线观看| 97在线免费观看| 日韩精品在线私人| 亚洲精品91美女久久久久久久| 最新日韩中文字幕| 亚洲精品国精品久久99热一| 国产精品久久久久久久电影| 亚洲经典中文字幕| 国产精品视频大全| 美日韩精品免费观看视频| 亚洲免费视频观看| 欧美裸体xxxx极品少妇软件|