資料結構3 1線性表的推廣 陣列

2021-09-09 07:00:35 字數 2868 閱讀 8414

陣列可看成一種特殊的線性表,其資料元素本身也是乙個線性表。假設乙個二維陣列a(m*n)有m行n列,那麼可以把這個二維陣列看成乙個線性表:

a = (a0,a1…am-1)

其中,每個元素ai是乙個行向量組成的線性表:

ai = (ai 0,ai 1…ai n-1)(0<=i<=m-1)

也可以看作是乙個由列向量組成的元素組成的線性表。

那麼以此類推,乙個n維陣列可以看成是n-1維陣列的線性表。

因為陣列一旦建立,陣列的元素個數和元素關係就不能再改變,因此無元素插入刪除操作,其基本操作主要是元素的讀取和更新。

1->讀取操作value(a,index1,index2,…,indexd),其功能是返回由下標index1,index2,…,indexd確定的陣列a的對應元素值

2->更新操作assign(a,e,index1,index2,…,indexd),其功能是將e的值賦給陣列a中下標為index1,index2,…,indexd的元素

3->輸出操作list(a),其功能是輸出陣列a的全部元素

由陣列定義可知,用順序儲存結構最為理想。

而因次序約定問題又把二維陣列的儲存方式分為行優先儲存方式以及列優先儲存方式

按以上兩種儲存方式儲存的陣列,只要知道起始結點的存放位址(基位址)、維數和每維的上下界,以及每個陣列元素所占用的位元組數,就能將陣列元素的存放位址表示為其下標的線性函式。一旦規定了陣列的維數和各維的長度,便可為他分配儲存空間。

以行優先儲存方式儲存的陣列舉例,每個元素佔l個位元組,其ai j的位址計算公式為:

loc(ai j) = loc(a0 0) + (i * n + j) * l

推廣得n維陣列各維長度為bi,陣列中每個資料元素對應於一組下標(j1,j2…jn),(0<=ji<=bi - 1)(1<=i<=n)有:

loc(aj1 j2…jn) = loc(a0 0…0) + (b2 * … bn * j1 + b3 * … * bn * j2 + … + bn * jn-1 + jn) * l

通常用二維陣列來儲存來儲存矩陣。但對於一些高階矩陣,其中含許多同值元素或零元素,若為其全部分配記憶體過於浪費,為節省空間,對其進行壓縮儲存,多個同值元素值分配乙個儲存空間,零元素不分配空間。

其中分為兩類可壓縮的矩陣:

同值元素或零元素在矩陣中的分布有規律——特殊矩陣

非零元素較少且分配沒有規律——稀疏矩陣

對稱矩陣:ai j == aj i,因其元素關於主對角線對稱,因此在儲存時可只儲存其上三角或下三角中的元素,使對稱元素共享乙個儲存空間。

按行優先順序儲存儲存下三角部分(包括對角線)元素,假設以一組陣列a[n(n-1)/2]作為n階對稱矩陣a的儲存結構,則矩陣a的任意元素aij和a[k]之間的對應關係為:

k = i(i-1)/2 + j (i >= j)

k = j(j-1)/2 + i (i < j)

三角矩陣:矩陣的下(上)三角(不包括主對角線)中的元素均為常數c。與對稱矩陣的不同就是多開闢乙個儲存空間來儲存常量c。

假設以一組陣列a[n(n-1)/2 + 1]作為n階對稱矩陣a的儲存結構,則三角矩陣a的任意元素aij和a[k]之間的對應關係為:

上三角矩陣:

k = i(2n - i + 1)/2 + j - i (i<=j)

k = n(n + 1)/2 (i < j)

下三角矩陣:

k = i(i + 1)/2 + j (i<=j)

k = n(n + 1)/2 (i < j)

其中a[n(n + 1)/2]用於存放常量c

對角矩陣

所有非零元素集中在以主對角線為中心的帶狀區域中。

假設以行優先儲存方式把n階三角矩陣a儲存到一維陣列a[3n-2]中,則a[k]和aij的對應關係為:

k = 2i + j(| i - j | <= 1)

每乙個非零元素由乙個**三元組( i, j, aij)**唯一確定,因此可將其所有非零元素按一定次序排列構成乙個三元組線性表。

三元組表的型別說明

#define maxsize 100

//定義三元組順序表的最大長度

typedef

int elemtype;

typedef

struct

tupletype;

typedef

struct

table;

每個非零元用乙個含五個域的結點表示,其中i,j,value三個域分別表示該非零元素所在的行列和非零元素值,向右域right用以鏈結同一行中下乙個非零元素,向下域down用以鏈結同一列中下乙個非零元素。

設定行列頭結點和煉表頭結點,其中行列頭結點的i,j域值均為-1,行的right值指向該鍊錶的第乙個結點,down域為空;列頭結點的down值指向該列鍊錶的第1個結點,他的right值為空。煉表頭結點的ij值為稀疏矩陣的行數列數。

十字鍊錶的結點型別定義

#include

#define m 3

//矩陣行數

#define n 4

//矩陣列數

#define max((m) > (n) ? (m) : (n))

//矩陣行列最大值

typedef

struct mtxn

tag;

}manode;

資料結構3 2線性表的推廣 廣義表

廣義表的資料元素本身也可以是乙個資料結構,但與陣列不同,廣義表的不同元素可以有不同的結構。廣義表是n個元素a1,a2,a3,an的有限序列,其中ai或者是原子項,或者是乙個廣義表。一般記為 ls a1,a2,a3,an ls為廣義表的名字,n為廣義表的長度,若n為0,稱為空表。若ai是原子型的資料元...

資料結構 線性表 陣列實現

按照上述抽象描述,定義乙個模板類來描述上述的抽象描述。templateclass linearlist bool isempty const 判斷線性表是否為空 int length const 線性表長度 bool find int k,t x const 返回第k個元素到x中 int searc...

資料結構 線性表之陣列

什麼叫陣列 陣列 array 是一種線性表資料結構。它是一組連續的記憶體空間,來儲存一組具有相同型別的資料。什麼線性表跟非線性表 線性表 通俗一點就是資料像一條線一樣排成的結構,線性表上的資料只有前後兩個方向,另外像鍊錶,佇列,棧等也是線性表的資料結構。非線性表 像二叉樹,圖,堆等,資料之間不只是前...