資料結構 陣列 矩陣 和廣義表

2021-08-29 04:41:49 字數 2998 閱讀 6161

陣列的儲存結構:一維陣列、多維陣列都是存放在乙個按行優先(也可以按列優先)的一維長陣列中。

對稱矩陣中的元素是按主對角線對稱的,即上三角部分和下三角部分元素是對應相等的。

在儲存時,一般儲存主對角線元素以及下三角部分元素,按行優先。

n階對稱矩陣a可以儲存在一維陣列b[0..n(n+1)/2-1],一共需儲存n(n+1)/2個元素。(陣列b下標k從0開始)

一維陣列b中 b[k] 與矩陣中元素的 i 和 j 的關係:

上(下)三角矩陣指的是下(上)三角部分中的元素均為常數c的方陣。

對於上三角矩陣,儲存主對角線元素、上三角部分元素,另外用乙個元素儲存常數c,按行優先。

n階上三角矩陣a可以儲存在一維陣列b[0..n(n+1)/2],一共需儲存n(n+1)/2+1個元素。(陣列b下標k從0開始)

對於上三角矩陣,一維陣列b中 b[k] 與矩陣中元素的 i 和 j 的關係:

對於下三角矩陣,一維陣列b中 b[k] 與矩陣中元素的 i 和 j 的關係:

對角矩陣指的是滿足其所有非零元素都集中在以主對角線為中心的帶狀區域中,即其主對角線上、下方各有b條非零元素構成的次對角線的n階方陣。

其中,b稱為矩陣的半頻寬,(2b+1)稱為矩陣的頻寬。

對角矩陣只儲存其非零元素。只有第0行和第n-1行只有兩個非零元素,其餘行都有3個非零元素。

一維陣列b中 b[k] 與矩陣中元素的 i 和 j 的關係:

(可以分別對每行第1個元素、每行第2個元素、每行第3個元素進行討論得到可得,如下圖)

當乙個階數較大的矩陣中的非零元素個數 s 相對於矩陣元素的總個數 t 非常小時,即 s只儲存非零元素,為了同時儲存非零元素在矩陣中的位置資訊,需要同時儲存該非零元素的行下標 i 、列下標 j 和元素值。

即每個非零元素由乙個三元組

稀疏矩陣的三元組順序表簡稱三元組表(list of 3-tuples)

三元組順序表的資料型別宣告

#define m 50			//數值為稀疏矩陣行數

#define n 50 //數值為稀疏矩陣列數

#define maxsize 60 //數值為稀疏矩陣中非零元素最多的個數

typedef int elemtype;

typedef struct tupnode;

typedef struct tsmatrix;

從乙個二維稀疏矩陣建立其三元組表示

void createmat(tsmatrix &t, elemtype a[m][n]) 

} }}

三元組元素的賦值

bool value(tsmatrix &t, elemtype x, int i, int j) 

t.data[k].r = i;

t.data[k].c = j;

t.data[k].d = x;

t.nums++;

} return true;

}

將指定位置的元素值賦給變數

bool assign(tsmatrix t, elemtype &x, int i, int j)
輸出三元組

void dispmat(tsmatrix t)
稀疏矩陣轉置

void trantat(tsmatrix t, tsmatrix &tb) 

}} }

}

建立稀疏矩陣的十字鍊錶的步驟:

1)對於稀疏矩陣中每個非零元素建立乙個結點存放它,包含元素的行號、列號和元素值

2)將同一行的所有結點構成乙個帶頭結點的迴圈單鏈表,行號為 i 的單鏈表的頭結點為 hr[i]。

hr[i] 頭結點的行指標指向行號為 i 的單鏈表的首結點

3)將同一列的所有結點構成乙個帶頭結點的迴圈單鏈表,列號為 j 的單鏈表的頭結點為 hd[j]。

hd[j] 頭結點的列指標指向列號為 j 的單鏈表的首結點

4)事實上,可以將hr[i] 和 hd[j]合起來變為h[i], 即h[i]同時包含行指標和列指標。

h[i] 頭結點的行指標指向行號為 i 的單鏈表的首結點,h[i] 頭結點的列指標指向列號為 i 的單鏈表的首結點。

(h[i]個數取行數與列數中較大者)

5)再將所有頭結點h[i] 連起來構成乙個帶頭結點的迴圈單鏈表,頭結點為hm

6)最後在總頭結點hm 中存放稀疏矩陣的行數和列數等資訊。

乙個稀疏矩陣的十字鍊錶,如圖: 

稀疏矩陣的十字鍊錶的結點型別matnode宣告

typedef int elemtype;

typedef struct mtxn tag;

}matnode;

通過頭結點h[i] 的h[i]->right 指標可以逐行搜尋行下標為i 的所有非零元素,h[i]->down指標可以逐列搜尋列下標為i 的所有非零元素。每乙個非零元素同時包含在兩個鍊錶中,方便運算中行方向和列方向的搜尋,因而降低了演算法的時間複雜度。(不用按k逐一遍歷)

稀疏矩陣十字鍊錶的運算演算法設計比較複雜,不再贅述

資料結構 8 陣列矩陣和廣義表

陣列 具有相同型別的資料元素的集合 一維陣列不說了,二維陣列 套娃陣列 行 列 體會一下 typedef int arra1 n typedef array1 array2 m 陣列特點 結構固定 維度和維界不變,沒有那些亂七八糟的操作 一般採取順序儲存結構來表示陣列 感覺還是比較簡單的 假設有乙個...

資料結構 陣列 矩陣 廣義表儲存

陣列的定義 陣列是下標index 和值value 組成的序對的集合。在陣列中,每個有定義的下標都與乙個值對應,這個值稱做陣列元素。每個序對形如 index,value 由於計算機的記憶體結構是一維的,因此用一維記憶體來表示多維陣列,就必須按某種次序將陣列元素排成一列序列,然後將這個線性序列存放在儲存...

資料結構 陣列和廣義表

感覺陣列這一段沒講什麼太多的東西。先是講了下定義,就是每個維度上都有對應的前驅後繼,首尾元素例外。操作只有初始化 銷毀 取元素 修改元素。然後講了下適合用順序儲存結構,多維情況下根據下標 j1 j2 j3 jn 找到對應畫素的儲存位置 cn l,ci 1 bi ci,loc loc基址 ciji l...