上篇講到線性結構,和線性結構相反的是非線性結構,非線性結構特色是一個結點元素可能有多個直接前驅和多個直接後繼。常見的非線性結構有:二(多)維數組、樹、圖。數組
原本計劃是非線性結構做爲一篇,寫着寫着發現內容確實太多了,拆分爲上、中、下3篇比較合適,因此改變了以前的計劃。spa
如:a[0][0]在水平方向有後繼a[0][1],垂直方向有後繼a[1][0],二維數組從水平方向或垂直方向看,某個元素都有前驅或後繼,並非線性結構。3d
其中行向量和列向量表示法分別對應二維數組的行序爲主序和列序爲主序兩種存儲方式。對於任意一個二維數組amxncode
行序爲主序儲存時,任意一個元素a[i][j]尋址公式爲:blog
&a[i][j] = &a[0][0] + (i * n + j) * data_size開發
其中:class
&a[i][j] : 爲元素a[i][j]的地址
方法
&a[0][0]:爲a[0][0]的存儲位置(即數組的起始位置)
im
data_size:數組裏儲存元素的長度d3
行序爲主序儲存時,任意一個元素a[i][j]尋址公式爲:
&a[i][j] = &a[0][0] + (j * m + i) * data_size
公式參數參考列序存儲公式參數說明。
相對於二維數組來講,三維以及N(N>2)維數組對於不少人來講可能不太熟悉,由於平常開發中用的比較少。對於三維數組能夠放到座標系裏類比,有了3個維度,以下圖所示:
分不了行和列了,其實返回去再看看二維數組,行爲主序存儲方式和列爲主序存儲方式其實分別對應的就是以左下標做爲主序存儲方式和以右下標做爲主序存儲方式。對於三(多)維數組來講也只有兩種存儲方式:以左下標做爲主序存儲方式和以右下標做爲主序存儲方式。
任意一個N(n>2)維數組A[i1][i2]…[in],按左下標做爲主序存儲時候,設A' = A[i1][i2]…[in-1],那麼A[i1][i2]…[in]能夠簡化爲A'[0],A'[1],A'[2],…,A'[in - 1],而後存儲A'時候,也用左下標優先方式轉化爲A''[0],A''[1],A''[2],…,A''[in-1 - 1],依次類推,當存儲最後1維數組時爲A[0][i2]…[in],A[1][i2]…[in],A[2][i2]…[in],…A[i1 - 1][i2]…[in],這樣就完成了N維數組的存儲。
給定一個A[k1][k2]…[kn]元素,求它在數組中存儲的位置能夠依據公式:
對於三維數組A[x][y][z]來講,當以左下標優先存儲時候,元素A[1][2][3]地址代入公式計算:
&A[1][2][3] = &A[0][0][0] + (3 + 2 * z + 1 * y * z) * data_size
爲了便於理解,三維數組a[3][4][5]左下標優先存儲示例:
左下標優先存儲: a[0][0][0] a[0][0][1] a[0][0][2] a[0][0][3] a[0][0][4] a[0][1][0] a[0][1][1] a[0][1][2] a[0][1][3] a[0][1][4] a[0][2][0] a[0][2][1] a[0][2][2] a[0][2][3] a[0][2][4] a[0][3][0] a[0][3][1] a[0][3][2] a[0][3][3] a[0][3][4] a[1][0][0] a[1][0][1] a[1][0][2] a[1][0][3] a[1][0][4] a[1][1][0] a[1][1][1] a[1][1][2] a[1][1][3] a[1][1][4] a[1][2][0] a[1][2][1] a[1][2][2] a[1][2][3] a[1][2][4] a[1][3][0] a[1][3][1] a[1][3][2] a[1][3][3] a[1][3][4] a[2][0][0] a[2][0][1] a[2][0][2] a[2][0][3] a[2][0][4] a[2][1][0] a[2][1][1] a[2][1][2] a[2][1][3] a[2][1][4] a[2][2][0] a[2][2][1] a[2][2][2] a[2][2][3] a[2][2][4] a[2][3][0] a[2][3][1] a[2][3][2] a[2][3][3] a[2][3][4]
任意一個N(n>2)維數組A[i1][i2]…[in],按右下標做爲主序存儲時候,設A' = A[i2]…[in-1][in],那麼A[i1][i2]…[in]能夠簡化爲A'[0],A'[1],A'[2],…,A'[i1 - 1],而後存儲A'時候,也用右下標優先方式轉化爲A''[0],A''[1],A''[2],…,A''[i2 - 1],依次類推,當存儲第n維數組時爲A[i1][i2]…[in-1][0],A[i1][i2]…[in-1][1],…A[i1][i2]…[in-1][in - 1],這樣就完成了N維數組的存儲。
給定一個A[k1][k2]…[kn]元素,求它在數組中存儲的位置能夠依據公式:
對於三維數組A[x][y][z]來講,當以右下標優先存儲時候,元素A[1][2][3]地址代入公式計算:
&A[1][2][3] = &A[0][0][0] + (1 + 2 * x + 3 * x * y) * data_size
爲了便於理解,三維數組a[3][4][5]右下標優先存儲示例:
右下標優先存儲: a[0][0][0] a[1][0][0] a[2][0][0] a[0][1][0] a[1][1][0] a[2][1][0] a[0][2][0] a[1][2][0] a[2][2][0] a[0][3][0] a[1][3][0] a[2][3][0] a[0][0][1] a[1][0][1] a[2][0][1] a[0][1][1] a[1][1][1] a[2][1][1] a[0][2][1] a[1][2][1] a[2][2][1] a[0][3][1] a[1][3][1] a[2][3][1] a[0][0][2] a[1][0][2] a[2][0][2] a[0][1][2] a[1][1][2] a[2][1][2] a[0][2][2] a[1][2][2] a[2][2][2] a[0][3][2] a[1][3][2] a[2][3][2] a[0][0][3] a[1][0][3] a[2][0][3] a[0][1][3] a[1][1][3] a[2][1][3] a[0][2][3] a[1][2][3] a[2][2][3] a[0][3][3] a[1][3][3] a[2][3][3] a[0][0][4] a[1][0][4] a[2][0][4] a[0][1][4] a[1][1][4] a[2][1][4] a[0][2][4] a[1][2][4] a[2][2][4] a[0][3][4] a[1][3][4] a[2][3][4]