最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

數(shù)據(jù)結(jié)構(gòu) 數(shù)組順序存儲(chǔ)詳細(xì)介紹

 更新時(shí)間:2017年05月23日 17:11:00   投稿:lqh  
這篇文章主要介紹了數(shù)據(jù)結(jié)構(gòu) 數(shù)組順序存儲(chǔ)詳細(xì)介紹的相關(guān)資料,需要的朋友可以參考下

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

          最近學(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ù)不定的問題。
//舉例:設(shè)有4維數(shù)組,各維分別是:4,5,6,7(這些數(shù)字是隨意給的),那么,調(diào)用方式:
//InitArray(ar, 4, 4, 5, 6, 7);
//ar其中,ar也是假設(shè)的變量名稱, 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類型,是存放變長(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)存就只有一維這么一種形式),存在如何按“多維”的邏輯角度定位元素的問題。再說清楚些:假設(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è)程序后面要處理的主要問題。
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];
//說到這里,這個(gè)問題就清晰了:A.constants中的元素,是幫助定位用的。比如說:對(duì)于(2,0,0,0)這個(gè)下標(biāo)的元素,應(yīng)該越過前面的(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;

補(bǔ)充:為什么A.constants[dim-1]

bounds存的就是每一維里面的個(gè)數(shù),constants保存的是每一個(gè)維度如果下標(biāo)增加1,那個(gè)對(duì)應(yīng)到內(nèi)存空間的下標(biāo)應(yīng)該增加多少。說起來比較抽象,我們假設(shè)是3維,就比較容易說清楚了,首先把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è)公式的來歷。當(dāng)然,我只是很簡(jiǎn)單的解釋了,很多細(xì)節(jié)需要你自己考慮,因?yàn)檎Z言表示起來太復(fù)雜了,不知道怎么表述。。。
其實(shí)你仔細(xì)看A.constants[i]=A.bounds[i+1] * A.constants[i+1];,這是一個(gè)遞推公式,把它展開的話,下面我就把constants[i]簡(jiǎn)寫為coni,bounds[i]簡(jiǎn)寫為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)于上面說的高度*長(zhǎng)度*寬度? 剛才那個(gè)bon[dim]應(yīng)該寫成bon[dim-1]不過這個(gè)不影響理解。

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

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

相關(guān)文章

  • C++訪問std::variant類型數(shù)據(jù)的幾種方式小結(jié)

    C++訪問std::variant類型數(shù)據(jù)的幾種方式小結(jié)

    std::variant是?C++17中引入的一個(gè)新的類模板,提供了一種存儲(chǔ)不同類型的值的方式,本文主要介紹了C++訪問std::variant類型數(shù)據(jù)的幾種方式小結(jié),具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-02-02
  • C++從txt文件中讀取二維的數(shù)組方法

    C++從txt文件中讀取二維的數(shù)組方法

    今天小編就為大家分享一篇C++從txt文件中讀取二維的數(shù)組方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2018-07-07
  • C++虛函數(shù)表的原理與使用解析

    C++虛函數(shù)表的原理與使用解析

    對(duì)C++?了解的人都應(yīng)該知道虛函數(shù)(Virtual?Function)是通過一張?zhí)摵瘮?shù)表(Virtual?Table)來實(shí)現(xiàn)的。簡(jiǎn)稱為V-Table。本文就將詳細(xì)講講虛函數(shù)表的原理與使用,需要的可以參考一下
    2022-04-04
  • C語言中的sscanf()函數(shù)使用

    C語言中的sscanf()函數(shù)使用

    本文主要介紹了C語言中的sscanf()函數(shù)使用,sscanf通常被用來解析并轉(zhuǎn)換字符串,可以實(shí)現(xiàn)很強(qiáng)大的字符串解析功能,下面就一起來了解一下
    2023-05-05
  • 關(guān)于在C程序中處理UTF-8文本的方法詳解

    關(guān)于在C程序中處理UTF-8文本的方法詳解

    這篇文章主要給大家介紹了關(guān)于在C程序中處理UTF-8文本的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來一起看看吧。
    2017-11-11
  • C++實(shí)現(xiàn)LeetCode(105.由先序和中序遍歷建立二叉樹)

    C++實(shí)現(xiàn)LeetCode(105.由先序和中序遍歷建立二叉樹)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(105.由先序和中序遍歷建立二叉樹),本篇文章通過簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • matlab模擬退火算法單約束車間流水線調(diào)度解決實(shí)現(xiàn)及示例

    matlab模擬退火算法單約束車間流水線調(diào)度解決實(shí)現(xiàn)及示例

    這篇文章主要為大家介紹了matlab模擬退火算法求解單約束車間流水線調(diào)度的實(shí)現(xiàn)及示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步
    2022-02-02
  • c++ 類和對(duì)象總結(jié)

    c++ 類和對(duì)象總結(jié)

    這篇文章主要介紹了c++ 類和對(duì)象總結(jié)一,需要的朋友可以參考下
    2020-01-01
  • Qt利用QChart實(shí)現(xiàn)實(shí)時(shí)波形圖的繪制

    Qt利用QChart實(shí)現(xiàn)實(shí)時(shí)波形圖的繪制

    這篇文章主要介紹了Qt如何利用QChart實(shí)現(xiàn)實(shí)時(shí)波形圖的繪制,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)有一定是參考價(jià)值,需要的可以參考一下
    2022-06-06
  • C++基礎(chǔ)概念講述

    C++基礎(chǔ)概念講述

    這篇文章主要介紹了C++基礎(chǔ)概念,??本次為C++的一個(gè)開篇,重點(diǎn)是更好的理解C++相對(duì)于其他編程語言的一個(gè)特性,之后會(huì)持續(xù)更新,本次專欄計(jì)劃是掌握C++的基礎(chǔ)語法以及常用特性,并且從細(xì)節(jié)上去理解,需要的朋友可以參考一下
    2021-12-12

最新評(píng)論

晋州市| 万荣县| 彰化县| 古浪县| 三河市| 涞源县| 蓬安县| 嘉峪关市| 略阳县| 西林县| 洛阳市| 达拉特旗| 阿荣旗| 夹江县| 甘谷县| SHOW| 新巴尔虎右旗| 新晃| 浙江省| 浦江县| 大同县| 孝义市| 辽宁省| 怀安县| 绍兴市| 靖西县| 商城县| 东辽县| 新津县| 凉山| 平陆县| 海晏县| 饶河县| 连州市| 西乌| 丰宁| 淮北市| 奎屯市| 绩溪县| 浮山县| 铜陵市|