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

首頁 > 編程 > C > 正文

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

2020-02-24 14:25:43
字體:
來源:轉載
供稿:網友

???????數組是線性存儲結構,通常只對存儲的數據進行搜索和修改,因此數組結構的實現采用順序存儲結構,下文是武林技術頻道小編做出的數據結構、數組順序存儲的詳細介紹,一起去看看吧。

數據結構 數組順序存儲

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

#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
国产精品电影在线观看| 97视频免费在线看| 欧美在线播放视频| 在线观看精品国产视频| 欧美尺度大的性做爰视频| 精品久久久久久久久中文字幕| 成人福利视频在线观看| 久久免费国产视频| 亚洲一二三在线| 欧美xxxwww| 欧美成人免费大片| 亚洲欧美在线x视频| 亚洲国产天堂久久综合网| 亚洲香蕉av在线一区二区三区| 国产精品狠色婷| 亚洲成人动漫在线播放| 国产精品一区二区三区在线播放| 国产精品一区二区三区久久| 国产在线观看精品| 国产精品96久久久久久又黄又硬| 欧美—级高清免费播放| 91精品国产综合久久男男| 91久久久亚洲精品| 久久久久国产精品免费| 久久九九有精品国产23| 成人免费看吃奶视频网站| 亚洲一级黄色av| 韩国v欧美v日本v亚洲| 久久精品久久精品亚洲人| 91欧美激情另类亚洲| 国产精品夫妻激情| 国产精品女主播| 国产精品视频区| 欧美激情网站在线观看| 欧美激情一二区| 亚洲精品乱码久久久久久按摩观| 欧美视频二区36p| 亚洲人成电影网站色xx| 91久久在线播放| 欧美性猛交xxxx黑人| www国产精品com| 亚洲国产精久久久久久久| 久久精品色欧美aⅴ一区二区| 欧美成人免费全部观看天天性色| 国产一区二区三区在线播放免费观看| 国产区精品视频| 国产综合视频在线观看| 亚洲日韩欧美视频一区| 久久视频中文字幕| 国产91热爆ts人妖在线| 国产欧美在线看| 欧美精品18videos性欧| 精品成人69xx.xyz| 久国内精品在线| 国内精品免费午夜毛片| 精品亚洲夜色av98在线观看| 色琪琪综合男人的天堂aⅴ视频| 91久热免费在线视频| 午夜精品一区二区三区av| 久久久最新网址| www.日韩欧美| 亚洲电影免费在线观看| 精品亚洲一区二区三区四区五区| 成人黄色网免费| 韩国视频理论视频久久| 精品久久久久久久久久国产| 欧美另类交人妖| 日韩激情在线视频| 亚洲精品成人网| 91美女高潮出水| 97热在线精品视频在线观看| 国产精品高潮在线| 久久91精品国产91久久跳| 欧美怡春院一区二区三区| 国产极品jizzhd欧美| 久久久久久av| 亚洲一区二区三区四区在线播放| 精品视频在线播放免| 国产精品美乳在线观看| 日韩小视频在线观看| 国产一区二区免费| 18久久久久久| 欧美裸体xxxx极品少妇| 久久激情视频久久| 51视频国产精品一区二区| 亚洲在线免费观看| 一本久久综合亚洲鲁鲁| 97在线视频免费播放| 国产精品第3页| 51精品国产黑色丝袜高跟鞋| 精品动漫一区二区三区| 精品中文字幕乱| 欧美激情手机在线视频| 亚洲免费av网址| 97av在线视频免费播放| 中文字幕日韩有码| 久久91精品国产91久久久| 国产精品旅馆在线| 国产精品视频导航| 久久久久一本一区二区青青蜜月| 日韩av网址在线观看| 精品爽片免费看久久| 黑人巨大精品欧美一区二区| 欧美极品在线视频| 色哟哟网站入口亚洲精品| 国产精品扒开腿做爽爽爽男男| 日韩精品一区二区三区第95| 日韩在线观看免费av| 国产精品video| 久久久久久久网站| 国产一区二区在线免费| 欧美理论电影在线播放| 国产亚洲视频在线观看| 亚洲v日韩v综合v精品v| 久久久久久九九九| 亚洲91精品在线观看| 国产精品久久久久久久久久小说| 自拍偷拍免费精品| 亚洲а∨天堂久久精品9966| 欧美日韩国产成人高清视频| 欧美国产日韩一区二区在线观看| 亚洲精品乱码久久久久久按摩观| 欧美日韩成人在线视频| 国产精品av在线播放| 成人黄色av网| 亚洲日本成人网| 亚洲精品久久久久久久久久久久久| 国产精品99久久99久久久二8| 一区二区三区精品99久久| 日韩成人性视频| 国产一区二区三区在线| 国产丝袜精品第一页| 欧美性jizz18性欧美| 久久伊人色综合| 国产精品专区h在线观看| 久久人人爽人人爽人人片av高请| 成人网在线视频| 国产一区二区三区三区在线观看| 精品亚洲aⅴ在线观看| 亚洲国产精品视频在线观看| 国产欧美一区二区三区久久人妖| 91夜夜揉人人捏人人添红杏| 国产精品视频一区二区三区四| 欧美国产日产韩国视频| 亚洲精品www| 久久久亚洲精品视频| 色系列之999| 欧美日本在线视频中文字字幕| 久久在线免费视频| 亚洲人成电影网站色xx| 久久亚洲国产精品成人av秋霞| 欧美激情第6页| 日韩在线观看网址| zzijzzij亚洲日本成熟少妇| 欧美精品激情blacked18| 91在线无精精品一区二区| 亚洲大胆美女视频| 国产精品久久综合av爱欲tv| 欧美极品美女视频网站在线观看免费| 亚洲小视频在线| 中文字幕亚洲情99在线| 久久精品视频99| 国语自产精品视频在线看| 亚洲天堂网站在线观看视频|