多維數組和廣義表是一種復雜的非線性結構,它們的邏輯特征是:一個數據元素可能有多個直接前驅和多個直接后繼。
多維數組
1、數組(向量)——常用數據類型
一維數組(向量)是存儲于計算機的連續存儲空間中的多個具有統一類型的數據元素。
同一數組的不同元素通過不同的下標標識。
(a1,a2,…,an)
2、二維數組
二維數組Amn可視為由m個行向量組成的向量,或由n個列向量組成的向量。
二維數組中的每個元素aij既屬于第i行的行向量,又屬于第j列的列向量。
3、多維數組
三維數組Amnp可視為以二維數組為數據元素的向量。四維數組可視為以三維數組為數據元素的向量……
三維數組中的每個元素aijk都屬于三個向量。四維數組中的每個元素都屬于四個向量……
4、數組的順序存儲方式
由于計算機內存是一維的,多維數組的元素應排成線性序列后存人存儲器。
數組一般不做插入和刪除操作,即結構中元素個數和元素間關系不變化。一般采用順序存儲方法表示數組。
(1)行優先順序
將數組元素按行向量排列,第i+1個行向量緊接在第i個行向量后面。
【例】二維數組Amn的按行優先存儲的線性序列為:
a11,a12,…,a1n,a21,a22,…,a2n,……,am1,am2,…,amn
注意:
①PASCAL和C語言中,數組按行優先順序存儲。
②行優先順序推廣到多維數組,可規定為先排最右的下標。
(2)列優先順序
將數組元素按列向量排列,第i+1個列向量緊接在第i個列向量后面。
【例】二維數組Amn的按列優先存儲的線性序列為:
a11,a21,…,am1,a12,a22,…,am2,……,a1n,a2n,…,amn
注意:
①FORTRAN語言中,數組按列優先順序存儲。
②列優先順序推廣到多維數組,可規定為先排最左的下標。
5、數組元素的地址計算公式
(1)按行優先順序存儲的二維數組Amn地址計算公式
LOC(aij)=LOC(a11)+[(i-1)×n+j-1]×d
其中:
①LOC(a11)是開始結點的存放地址(即基地址)
②d為每個元素所占的存儲單元數
③由地址計算公式可得,數組中任一元素可通過地址公式在相同時間內存取。即順序存儲的數組是隨機存取結構。
(2)按列優先順序存儲的二維數組Amn地址計算公式
LOC(aij)=LOC(a11)+[(j-1)×m+i-1]×d
(3)按行優先順序存儲的三維數組Amnp地址計算公式
LOC(aijk)=LOC(a111)+[(i-1)×n×p+(j-1)×p+k-1]×d
(4)下界不為1的二維數組的地址計算公式
①二維數組A[c1..d1,c2..d2]的地址計算公式:
LOC(aij)=LOC(ac1c2)+[(i-c1)×(d2-c2+1)+j-c2]×d
②下界為0的二維數組的地址計算公式(C語言中使用)
LOC(aij)=LOC(a00)+[i×(d2+1)+j]×d
注意:
以下討論的數組存儲結構都以C語言下標表示。
多維數組
1、數組(向量)——常用數據類型
一維數組(向量)是存儲于計算機的連續存儲空間中的多個具有統一類型的數據元素。
同一數組的不同元素通過不同的下標標識。
(a1,a2,…,an)
2、二維數組
二維數組Amn可視為由m個行向量組成的向量,或由n個列向量組成的向量。
二維數組中的每個元素aij既屬于第i行的行向量,又屬于第j列的列向量。
3、多維數組
三維數組Amnp可視為以二維數組為數據元素的向量。四維數組可視為以三維數組為數據元素的向量……
三維數組中的每個元素aijk都屬于三個向量。四維數組中的每個元素都屬于四個向量……
4、數組的順序存儲方式
由于計算機內存是一維的,多維數組的元素應排成線性序列后存人存儲器。
數組一般不做插入和刪除操作,即結構中元素個數和元素間關系不變化。一般采用順序存儲方法表示數組。
(1)行優先順序
將數組元素按行向量排列,第i+1個行向量緊接在第i個行向量后面。
【例】二維數組Amn的按行優先存儲的線性序列為:
a11,a12,…,a1n,a21,a22,…,a2n,……,am1,am2,…,amn
注意:
①PASCAL和C語言中,數組按行優先順序存儲。
②行優先順序推廣到多維數組,可規定為先排最右的下標。
(2)列優先順序
將數組元素按列向量排列,第i+1個列向量緊接在第i個列向量后面。
【例】二維數組Amn的按列優先存儲的線性序列為:
a11,a21,…,am1,a12,a22,…,am2,……,a1n,a2n,…,amn
注意:
①FORTRAN語言中,數組按列優先順序存儲。
②列優先順序推廣到多維數組,可規定為先排最左的下標。
5、數組元素的地址計算公式
(1)按行優先順序存儲的二維數組Amn地址計算公式
LOC(aij)=LOC(a11)+[(i-1)×n+j-1]×d
其中:
①LOC(a11)是開始結點的存放地址(即基地址)
②d為每個元素所占的存儲單元數
③由地址計算公式可得,數組中任一元素可通過地址公式在相同時間內存取。即順序存儲的數組是隨機存取結構。
(2)按列優先順序存儲的二維數組Amn地址計算公式
LOC(aij)=LOC(a11)+[(j-1)×m+i-1]×d
(3)按行優先順序存儲的三維數組Amnp地址計算公式
LOC(aijk)=LOC(a111)+[(i-1)×n×p+(j-1)×p+k-1]×d
(4)下界不為1的二維數組的地址計算公式
①二維數組A[c1..d1,c2..d2]的地址計算公式:
LOC(aij)=LOC(ac1c2)+[(i-c1)×(d2-c2+1)+j-c2]×d
②下界為0的二維數組的地址計算公式(C語言中使用)
LOC(aij)=LOC(a00)+[i×(d2+1)+j]×d
注意:
以下討論的數組存儲結構都以C語言下標表示。