數(shù)據(jù)結(jié)構(gòu)課件第5章數(shù)組和廣義表_第1頁
數(shù)據(jù)結(jié)構(gòu)課件第5章數(shù)組和廣義表_第2頁
數(shù)據(jù)結(jié)構(gòu)課件第5章數(shù)組和廣義表_第3頁
數(shù)據(jù)結(jié)構(gòu)課件第5章數(shù)組和廣義表_第4頁
數(shù)據(jù)結(jié)構(gòu)課件第5章數(shù)組和廣義表_第5頁
已閱讀5頁,還剩59頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1第5章數(shù)組和廣義表5.1數(shù)組的邏輯結(jié)構(gòu)5.2數(shù)組的順序存儲(chǔ)結(jié)構(gòu)5.3矩陣的壓縮存儲(chǔ)5.4廣義表5.1數(shù)組的邏輯結(jié)構(gòu)5.2數(shù)組的順序存儲(chǔ)結(jié)構(gòu)5.3矩陣的壓縮存儲(chǔ)5.4廣義表數(shù)據(jù)結(jié)構(gòu)課件第5章數(shù)組和廣義表共64頁,您現(xiàn)在瀏覽的是第1頁!數(shù)組(array)是最常用的數(shù)據(jù)結(jié)構(gòu)之一。幾乎所有的程序設(shè)計(jì)語言都把數(shù)組類型設(shè)定為固有類型。數(shù)組的定義線性結(jié)構(gòu)中的數(shù)據(jù)都是非結(jié)構(gòu)的原子類型,元素的值是不再分解的。而數(shù)組可以看成是線性表在下述含義上的擴(kuò)展:5.1數(shù)組的邏輯結(jié)構(gòu)2數(shù)組的基本操作表中的數(shù)據(jù)元素本身也是一種數(shù)據(jù)結(jié)構(gòu)。數(shù)據(jù)結(jié)構(gòu)課件第5章數(shù)組和廣義表共64頁,您現(xiàn)在瀏覽的是第2頁!數(shù)組是由下標(biāo)和值組成的序?qū)?。在?shù)組中,一旦給定下標(biāo),都存在一個(gè)與其相對(duì)應(yīng)的值,這個(gè)值就稱為數(shù)組元素。也可以說,數(shù)組中的每個(gè)數(shù)據(jù)元素都對(duì)應(yīng)于一組下標(biāo)(j1

,j2

,…,jn),每個(gè)下標(biāo)取值范圍是1≤ji≤bi,bi稱為第i

維的長度(i=1,2,…,n)。顯然,當(dāng)n=1時(shí),n維數(shù)組就退化為定長的線性表。反之,n

維數(shù)組也可以看成是線性表的推廣。3 5.1.1數(shù)組的定義數(shù)據(jù)結(jié)構(gòu)課件第5章數(shù)組和廣義表共64頁,您現(xiàn)在瀏覽的是第3頁! 每個(gè)數(shù)據(jù)元素α

j是一個(gè)列向量形式的線性表Am×n=…a1,na2,n…am,na13a23…am,3a12a22…am,2a11a21…am,1

二維數(shù)組A

還可以看成是一個(gè)線性表:A=(α1,α

2,…,α

n)

α

j=(a1j

,a2j

,…,am,j) 1≤j≤n 每個(gè)數(shù)據(jù)元素是一個(gè)行向量形式的線性表

B=(β1β2β3…,

βm)Am×n=((a11

a12

…a1,n

),…,(am,1am,2…am,n

))(a21

a22

…a2,n

),…,βi=(ai1,ai2,…,ai,n) 1≤i≤m4數(shù)據(jù)結(jié)構(gòu)課件第5章數(shù)組和廣義表共64頁,您現(xiàn)在瀏覽的是第4頁! 5.1.2數(shù)組的抽象類型定義ADTArray{

D={aj1j2j3…..jn|n>0,稱為數(shù)組的維數(shù),ji是數(shù)組的第i維下標(biāo),1≤ji

≤bi,

bi為數(shù)組第i維的長度,aj1j2j3…..jn∈ElementSet}數(shù)據(jù)關(guān)系:R

={R1,R2,…….Rn}Ri=<aj1…ji….jn,aj1…ji+1…jn>|1≤jk≤bk,1≤k≤n且k≠i,1≤ji

≤bi-1,aj1…j2….jn,aj1…ji+1…jn∈D,i=1,…n}基本操作:InitArray(A,n,bound1,…,boundn); 操作結(jié)果:如果維數(shù)n

和各維長度合法,則構(gòu)造 相應(yīng)的數(shù)組A,并且返回TRUE。數(shù)據(jù)結(jié)構(gòu)課件第5章數(shù)組和廣義表共64頁,您現(xiàn)在瀏覽的是第5頁!由于內(nèi)存儲(chǔ)器的結(jié)構(gòu)是一維的。一維數(shù)組可直接采用順序存儲(chǔ)。用一維的內(nèi)存存儲(chǔ)表示多維數(shù)組時(shí),需按某種次序?qū)?shù)組中元素排成一線性序列,再將這個(gè)線性序列存放在一維的內(nèi)存中,即數(shù)組的順序存儲(chǔ)結(jié)構(gòu)表示。順序存儲(chǔ)的定位公式5.2數(shù)組的順序存儲(chǔ)結(jié)構(gòu)6數(shù)組的順序存儲(chǔ)表示基本操作的算法描述數(shù)據(jù)結(jié)構(gòu)課件第5章數(shù)組和廣義表共64頁,您現(xiàn)在瀏覽的是第6頁!a21a11…am,1a22a12…am,2a1,n…a2,n…am,na21a11…am,1a21a11…Am,1a21a11…am,1a22a12…am,2a22a12…am,2a22a12…am,2………a1,na2,n…am,na1,na2,n…am,na1,na2,n…am

n7列主次序存放數(shù)據(jù)結(jié)構(gòu)課件第5章數(shù)組和廣義表共64頁,您現(xiàn)在瀏覽的是第7頁!對(duì)于數(shù)組,一旦規(guī)定了它的維數(shù)和各維的長度,便可以為它分配存儲(chǔ)空間。反之,只要給出一組下標(biāo),便可以求得相應(yīng)數(shù)組的存儲(chǔ)位置。8數(shù)據(jù)結(jié)構(gòu)課件第5章數(shù)組和廣義表共64頁,您現(xiàn)在瀏覽的是第8頁!

⑵二維數(shù)組的地址計(jì)算

假設(shè)每個(gè)數(shù)據(jù)元素占1

個(gè)存儲(chǔ)單元,且以行序?yàn)橹餍虻倪M(jìn)行存儲(chǔ),則二維數(shù)組A

中任一元素aij

的存儲(chǔ)位置可以由下面定位公式確定LOC(A[i],[j])=LOC(A[1],[1])+n*(i-1)+(j-1)其中:

LOC(A[i[,[j]) 是aij

的存儲(chǔ)位置;

LOC(A[1],[1]) 是a11

的存儲(chǔ)位置,即二維數(shù)組A

的起始存儲(chǔ)位置,也稱為基地址或基址;n 是數(shù)組第二維的長度。9

假設(shè)每個(gè)數(shù)據(jù)元素占size個(gè)存儲(chǔ)單元,則二維數(shù)組A

中任一元素aij

的存儲(chǔ)位置可以由下面定位公式確定LOC(A[i],[j])=LOC(A[1],[1])+(n*(i-1)+(j-1))*size數(shù)據(jù)結(jié)構(gòu)課件第5章數(shù)組和廣義表共64頁,您現(xiàn)在瀏覽的是第9頁!矩陣(matrix)是很多科學(xué)與工程計(jì)算問題中研究的數(shù)學(xué)對(duì)象。在數(shù)據(jù)結(jié)構(gòu)中,我們感興趣的不是矩陣本身,而是如何存儲(chǔ)矩陣的元素而使矩陣的各種運(yùn)算能夠有效地進(jìn)行。

特殊矩陣包括兩個(gè)部份:①元素分布有特殊規(guī)律的矩陣,找到規(guī)律對(duì)應(yīng)的公式,實(shí)現(xiàn)壓縮存儲(chǔ)。②非零元素很少的稀疏矩陣,可采用只存非零元素的方法實(shí)現(xiàn)壓縮存儲(chǔ)。5.3矩陣的壓縮存儲(chǔ)10數(shù)據(jù)結(jié)構(gòu)課件第5章數(shù)組和廣義表共64頁,您現(xiàn)在瀏覽的是第10頁!

假若相同的元素或者零元素在矩陣中的分布有一定規(guī)律,則稱特殊矩陣。特殊矩陣主要有3種:對(duì)稱矩陣、三角矩陣、帶狀矩陣。

在所有這些統(tǒng)稱為“特殊矩陣”的矩陣中,非零元的分布都有一個(gè)明顯的規(guī)律,從而都可以將其壓縮存儲(chǔ)到一維數(shù)組中,并且找到每個(gè)非零元在一維數(shù)組中的對(duì)應(yīng)關(guān)系。11 5.3.1特殊矩陣的壓縮存儲(chǔ)數(shù)據(jù)結(jié)構(gòu)課件第5章數(shù)組和廣義表共64頁,您現(xiàn)在瀏覽的是第11頁!

對(duì)于對(duì)稱矩陣,可以為每一對(duì)對(duì)稱元只分配一個(gè)存儲(chǔ)空間,這樣就可以將n2

個(gè)元壓縮存儲(chǔ)到n(n+1)/2個(gè)元的空間中。假設(shè)以行序?yàn)橹餍虼鎯?chǔ)對(duì)稱矩陣的下三角(包括對(duì)角線)中的元。以一維數(shù)組B[n(n+1)/2]作為n

階對(duì)稱矩陣M

的存儲(chǔ)結(jié)構(gòu),12a31a22a21a11an,n…an,1…BLoc(A[i][j]=1234……

Loc(A[i][j])=Loc(A[1][1])+i*(i-1)/2+j-1(i>j)數(shù)據(jù)結(jié)構(gòu)課件第5章數(shù)組和廣義表共64頁,您現(xiàn)在瀏覽的是第12頁!一個(gè)n

階方陣,若它的全部非零元素落在一個(gè)以對(duì)角線為中心的帶狀區(qū)域中,則稱該矩陣為帶狀矩陣,或?qū)蔷仃?。這個(gè)帶狀區(qū)域若包含主對(duì)角線上下各b

條對(duì)角線道上元素,那么,b

稱為該帶狀矩陣的半帶寬,或稱該帶狀矩陣的帶寬為(2b+1)。3.帶狀矩陣00b

條b

條13數(shù)據(jù)結(jié)構(gòu)課件第5章數(shù)組和廣義表共64頁,您現(xiàn)在瀏覽的是第13頁!帶狀矩陣中最常見的是三對(duì)角帶狀矩陣。14特點(diǎn):當(dāng)i=1j=1,21<i<n,j=i-1,i,i+1

i=n,j=n-1,n

aij非零,其它元素均為零

a11Ann=a12000a21a22a23000a32a33a34000a43a44a4500………數(shù)據(jù)結(jié)構(gòu)課件第5章數(shù)組和廣義表共64頁,您現(xiàn)在瀏覽的是第14頁!15一般來說,當(dāng)矩陣中非零元素的個(gè)數(shù)遠(yuǎn)遠(yuǎn)小于矩陣元素的總數(shù)時(shí),稱之為稀疏矩陣。假設(shè)在m×n

的矩陣中,若有t

個(gè)元素不為零,令=t/(m×n),則稱為矩陣的稀疏因子。通常認(rèn)為≤25%-30%時(shí)稱為稀疏矩陣。 5.3.2稀疏矩陣的邏輯結(jié)構(gòu)1.稀疏矩陣的定義數(shù)據(jù)結(jié)構(gòu)課件第5章數(shù)組和廣義表共64頁,您現(xiàn)在瀏覽的是第15頁!012900000000000-3000014000240000018000001500-7000M=矩陣M

可以由三元組表(1,3,-3),(1,6,15),(2,1,12),(2,5,18),(3,1,9),(3,4,24),(4,6,-7),(6,3,14)再加上(7,6)這一對(duì)總的行列值來描述。16數(shù)據(jù)結(jié)構(gòu)課件第5章數(shù)組和廣義表共64頁,您現(xiàn)在瀏覽的是第16頁!012900000000000-3000014000240000018000001500-7000M=13-3161521122518319342446-76314rowcoleA.data[1]A.data[2]A.data[3]A.data[4]A.data[5]A.data[6]A.data[7]A.data[8](a)稀疏矩陣(b)三元組順序表17數(shù)據(jù)結(jié)構(gòu)課件第5章數(shù)組和廣義表共64頁,您現(xiàn)在瀏覽的是第17頁!18原始的三元組表原矩陣012900000000000-3000014000240000018000001500-7000M=A.data[1]A.data[2]A.data[3]A.data[4]A.data[5]A.data[6]A.data[7]A.data[8]A.data13-3161521122518319342446-76314rowcole轉(zhuǎn)置矩陣00-3001512000180900240000000-70000000014000000000T=轉(zhuǎn)置的三元組表B.data[1]B.data[2]B.data[3]B.data[4]B.data[5]B.data[6]B.data[7]B.data[8]B.data121213931-3361443245218611564-7rowcole數(shù)據(jù)結(jié)構(gòu)課件第5章數(shù)組和廣義表共64頁,您現(xiàn)在瀏覽的是第18頁!①算法思想在A中按三元組的列域值(col)開始掃描,依序?qū)⑷MA.data的列域值(col

)與行域值(row

)進(jìn)行對(duì)換,并且存入B中。由于A是以M的行序?yàn)橹餍騺泶娣琶總€(gè)非零元的,由此得到轉(zhuǎn)置后矩陣的三元組表B恰是以“行序?yàn)橹餍颉薄?9

按照方法一,即按照“被轉(zhuǎn)置矩陣”M的三元組表A

的“列序”遞增順序進(jìn)行轉(zhuǎn)置。為了找到矩陣M

的每一列中所有的非零元素,需要對(duì)其三元組A.data從行起進(jìn)行掃描,方法如下:數(shù)據(jù)結(jié)構(gòu)課件第5章數(shù)組和廣義表共64頁,您現(xiàn)在瀏覽的是第19頁!voidTransposeTSMatrix(TSMatrixA,TSMatrix*B){//采用三元組表結(jié)構(gòu),求稀疏矩陣A

的轉(zhuǎn)置矩陣B。在程序中,inti,j,k;//j

指示B->data中三元組的序號(hào),//i

指示A.data中三元組的序號(hào),//k指示A的列號(hào)(即B的行號(hào))

B->m=A.n; //將稀疏矩陣A

的列數(shù)值作為其轉(zhuǎn)置矩陣B

的行數(shù)值B->n=A.m; //將稀疏矩陣A

的行數(shù)值作為其轉(zhuǎn)置矩陣B

的列數(shù)值B->len=A.len; //轉(zhuǎn)置矩陣B與稀疏矩陣A的非零元個(gè)數(shù)相等②算法編(稀疏矩陣“列序”遞增轉(zhuǎn)置算法)

if(B->len>0){

j=1;20數(shù)據(jù)結(jié)構(gòu)課件第5章數(shù)組和廣義表共64頁,您現(xiàn)在瀏覽的是第20頁!③算法分析一般矩陣的轉(zhuǎn)置算法(經(jīng)典算法)為:21for(col=0;col<n;++col) for(row=0;row<m;++row)

dest[col][row]=source[row][col];時(shí)間復(fù)雜度為O(m×n)。

前面給出的求轉(zhuǎn)置矩陣算法的主要工作是在i

和k的兩重循環(huán)中完成的,所以此算法的時(shí)間復(fù)雜度為O(A.n×A.len)即和矩陣A

的列數(shù)和非零元的個(gè)數(shù)的乘積成正比。數(shù)據(jù)結(jié)構(gòu)課件第5章數(shù)組和廣義表共64頁,您現(xiàn)在瀏覽的是第21頁!當(dāng)矩陣非零元素的位置或個(gè)數(shù)經(jīng)常變動(dòng)時(shí),就不易采用順序存儲(chǔ)結(jié)構(gòu)表示三元組的線性表。例如,在進(jìn)行“將矩陣

B

加到矩陣A

上”的操作時(shí),由于非零元素的插入或刪除將會(huì)引起A.data中元素的大量移動(dòng)。為此,對(duì)這種類型的矩陣,采用鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)表示三元組的線性表更為恰當(dāng)。222.十字鏈表數(shù)據(jù)結(jié)構(gòu)課件第5章數(shù)組和廣義表共64頁,您現(xiàn)在瀏覽的是第22頁!typedefstructOLNode{ //結(jié)點(diǎn)定義int row,col; //該非零元的行和列下標(biāo)ElementTypevalue; //該非零元的值

structOLNode *right,*down;//該非零元所在的行表和列表的后繼鏈域}OLNode;*Olink;typedefstruct{ //十字鏈表定義int m,n,len; //稀疏矩陣行數(shù)、列數(shù)和非零元個(gè)數(shù)Olink *row_head,*col_head;//行和列鏈表頭指針向量,由CreateSMatrix分配}CrossList; //十字鏈表存儲(chǔ)結(jié)構(gòu)的類型名23將行鏈表的頭指針存儲(chǔ)在一維數(shù)組M.row_head中將列鏈表的頭指針存儲(chǔ)在一維數(shù)組M.col_head中數(shù)據(jù)結(jié)構(gòu)課件第5章數(shù)組和廣義表共64頁,您現(xiàn)在瀏覽的是第23頁!CreateSMatrix_OL(CrossList*M){//創(chuàng)建稀疏矩陣M。采用十字鏈表存儲(chǔ)表示。(2)利用十字鏈表實(shí)現(xiàn)創(chuàng)建稀疏矩陣的運(yùn)算if(!(M->row_head=(Olink*)malloc((m+1)*sizeof(Olink))))exit(OVERFLOW);if(!(M->col_head=(Olink*)malloc((n+1)*sizeof(Olink))))exit(OVERFLOW);if(M)free(M);scanf(&m,&n,&t); //輸入M

的行數(shù)、列數(shù)和非零元個(gè)數(shù)

M->m=m;M->n=n;M->len=t;24①算法編寫數(shù)據(jù)結(jié)構(gòu)課件第5章數(shù)組和廣義表共64頁,您現(xiàn)在瀏覽的是第24頁!if(M->row_head[i]==NULL){M->row_head[i]=p;p->right=NULL;}else{for(q=M->row_head[i];(q->right)&&q->right->col<j; q=q->right); p->right=q->right;q->right=p;}//完成行插入elseif(M->row_head[i]->col>j){//尋找在行表中的插入位置 p->right=M->row_head[i];M->row_head[i]=p;}25數(shù)據(jù)結(jié)構(gòu)課件第5章數(shù)組和廣義表共64頁,您現(xiàn)在瀏覽的是第25頁!∧∧∧∧∧∧∧M->col_headM->row_head(1)輸入(1,1,3)1∧13∧p(2)輸入(1,3,5)p135q∧(3)輸入(1,4,9)∧149pq∧∧(4)輸入(3,1,2)312∧p∧q26(5)輸入(2,3,4)234q∧∧(6)輸入(2,2,8)q創(chuàng)建稀疏矩陣M

的十字鏈表if(M.rhead[i]==NULL){M.rhead[i]=p;p->right=NULL;}for(q=M->col_head[i];(q->down)&&q->down->row<i; q=q->down);p->down=q->down;q->down=p;if(M->row_head[i]->j>j){p->right=M->row_head[i];M->row_head[i]=p;}if(M->col_head[j]==NULL){M->col_head[j]=p;p->down=NULL;}pq∧p228if(M->col_head[j]==NULL){M->col_head[j]=p;p->down=NULL;}for(q=M->row_head[i];(q->right)&&q->right->col<j; q=q->right);p->right=q->right;q->right=p;if(M->col_head[j]==NULL){M->col_head[j]=p;p->down=NULL;}for(q=M->row_head[i];(q->right)&&q->right->col<j; q=q->right);p->right=q->right;q->right=p;if(M->col_head[j]==NULL){M->col_head[j]=p;p->down=NULL;}if(M->row_head[i]==NULL){M->row_head[i]=p;p->right=NULL;}for(q=M->col_head[i];(q->down)&&q->down->row<i; q=q->down);p->down=q->down;q->down=p;if(M->row_head[i]==NULL){M->row_head[i]=p;p->right=NULL;}數(shù)據(jù)結(jié)構(gòu)課件第5章數(shù)組和廣義表共64頁,您現(xiàn)在瀏覽的是第26頁!廣義表(generalizedlist)是線性表的推廣,有時(shí)也稱為列表(lists,用復(fù)數(shù)形式以示與統(tǒng)稱的表list的區(qū)別)。廣泛地應(yīng)用于人工智能等領(lǐng)域的LISP(表處理語言),把廣義表作為基本的數(shù)據(jù)結(jié)構(gòu),就連程序也表示為一系列的廣義表。275.4廣義表數(shù)據(jù)結(jié)構(gòu)課件第5章數(shù)組和廣義表共64頁,您現(xiàn)在瀏覽的是第27頁!28 5.4.1廣義表的邏輯結(jié)構(gòu)廣義表一般記作:GL=(a1,a2,…,an)其中:

n

是廣義表GL

的長度;

ai 可以是單個(gè)元素,也可以是廣義表,分別稱為廣義表GL

的原子和子表,習(xí)慣上用大寫字母表示廣義表的名稱,用小寫字母表示原子的名稱。GL

是廣義表(a1,a2,…,an)的名稱;1.廣義表的定義數(shù)據(jù)結(jié)構(gòu)課件第5章數(shù)組和廣義表共64頁,您現(xiàn)在瀏覽的是第28頁!

例5-1

A=(),A

是一個(gè)空表,它的長度為零。

例5-2

B=(e),B

只有一個(gè)原子e,它的長度為1。

例5-3

C=(a,(b,c,d)),C

的長度為2,兩個(gè)元素分別為原子a

和子表(b,c,d)。

例5-4

D=(A,B,C),D

的長度為3,三個(gè)元素分別為A、B和C,都是廣義表。顯然,將上面所述三個(gè)子表的值代入以后,則有D=((),(e),(a,(b,c,d)))。

例5-5

E=(a,E),這是一個(gè)遞歸表,它的長度為2,E相當(dāng)于一個(gè)無限的廣義表E=(a,(a,(a,…)))。292.廣義表的三個(gè)重要結(jié)論數(shù)據(jù)結(jié)構(gòu)課件第5章數(shù)組和廣義表共64頁,您現(xiàn)在瀏覽的是第29頁!ecdbaBACD表示廣義表表示原子30數(shù)據(jù)結(jié)構(gòu)課件第5章數(shù)組和廣義表共64頁,您現(xiàn)在瀏覽的是第30頁!(1)A=() (2)B=(e)(3)C=(a,(b,c,d)) (4)D=(A,B,C)(5)E=(a,E)GetHead(B)=e GetTail(B)=()GetHead(C)=a GetTail(C)=((b,c,d))GetHead(D)=A GetTail(D)=(B,C)由于(B,C)為非空廣義表,令F=(B,C),則可以繼續(xù)分解得到:

GetHead(F)=B GetTail(F)=(C)

任何一個(gè)非空廣義表的表頭可能是原子,也可能是廣義表;而其表尾必定是廣義表。例如,廣義表如下:

對(duì)定義表B,C,D

取表頭和取表尾的操作結(jié)果:31數(shù)據(jù)結(jié)構(gòu)課件第5章數(shù)組和廣義表共64頁,您現(xiàn)在瀏覽的是第31頁!由于廣義表(a1,a2,…,an)中的數(shù)據(jù)元素可以具有不同的結(jié)構(gòu)(或是原子,或是廣義表),因此很難用順序結(jié)構(gòu)表示,通常采用鏈?zhǔn)酱鎯?chǔ)結(jié)構(gòu)。在這種結(jié)構(gòu)中,需要兩種結(jié)構(gòu)的結(jié)點(diǎn)。32 5.4.2廣義表的存儲(chǔ)結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu)課件第5章數(shù)組和廣義表共64頁,您現(xiàn)在瀏覽的是第32頁!typedefenum{ATOM,LIST}ElemTag;//ATOM==0:原子;LIST==1:子表typedefstructGLNode{ElemTagtag;//公共部分,用于區(qū)分原子結(jié)點(diǎn)和表結(jié)點(diǎn)

union{ //原子結(jié)點(diǎn)和表結(jié)點(diǎn)的聯(lián)合部分AtomType atom; //原子結(jié)點(diǎn)的值域structGLNode*hp; //表結(jié)點(diǎn)的表頭指針};structGLNode*tp;//相當(dāng)于線性鏈表的next,指向下一個(gè)元素結(jié)點(diǎn)}GLNode,*GList; //廣義表擴(kuò)展線性鏈表類型名33數(shù)據(jù)結(jié)構(gòu)課件第5章數(shù)組和廣義表共64頁,您現(xiàn)在瀏覽的是第33頁!

可以把二維數(shù)組看成是這樣一個(gè)定長線性表:它的每個(gè)數(shù)據(jù)元素也是一個(gè)定長線性表。Am×n=a11a21…am1a12a22…am2a13a23…am3…………a1.na2,n…am,n34例如,下面是一個(gè)二維數(shù)組,且以m

行n

列的矩陣形式表示。數(shù)據(jù)結(jié)構(gòu)課件第5章數(shù)組和廣義表共64頁,您現(xiàn)在瀏覽的是第34頁!數(shù)組一旦被定義,它的維數(shù)和維界就不再改變。因此,除了結(jié)構(gòu)的初始化和銷毀之外,數(shù)組只有存取數(shù)據(jù)元素和修改數(shù)據(jù)元素值的操作。35數(shù)據(jù)結(jié)構(gòu)課件第5章數(shù)組和廣義表共64頁,您現(xiàn)在瀏覽的是第35頁!36 5.1.2數(shù)組的抽象類型定義DestroyArray(A):銷毀數(shù)組A。GetValue(A,e,index1,…,indexn):初始條件:A

是n

維數(shù)組,e

為元素變量,隨后是

n

個(gè)下標(biāo)值。 操作結(jié)果:若各下標(biāo)合法,則用e返回?cái)?shù)組A中由由index1,…indexn所指定的元素的值.SetValue(A,e,index1,…,indexn); 初始條件:A

是n

維數(shù)組,e

為元素變量,隨后是

n

個(gè)下標(biāo)值。 操作結(jié)果:若各下標(biāo)合法,則將數(shù)組A中由index1,…indexn所指定的元素的值置為e.數(shù)據(jù)結(jié)構(gòu)課件第5章數(shù)組和廣義表共64頁,您現(xiàn)在瀏覽的是第36頁!

用順序存儲(chǔ)結(jié)構(gòu)來存儲(chǔ)數(shù)組中的元素,一定要按照某種次序?qū)⒃嘏懦梢粋€(gè)線性序列。有兩種存儲(chǔ)方式:(1)以列為主序(columnmajororder)的存儲(chǔ)方式,即按列優(yōu)先,逐列順序存儲(chǔ)。(2)以行為主序(rowmajororder)的存儲(chǔ)方式,即按行優(yōu)先,逐行順序存儲(chǔ)。37 5.2.1順序存儲(chǔ)的定位公式數(shù)據(jù)結(jié)構(gòu)課件第5章數(shù)組和廣義表共64頁,您現(xiàn)在瀏覽的是第37頁!a12a11…a1.na22a21…a2,nam,1…am,2…am,na12a11…a1.na22a21…a2,n………am,1am,2…am,na12a11…a1,na12a11…a1,na22a21…a2,na22a21…a2,nam,1am,2…am,nam,1am,2…am,n38行主次序存放數(shù)據(jù)結(jié)構(gòu)課件第5章數(shù)組和廣義表共64頁,您現(xiàn)在瀏覽的是第38頁!(1)一維數(shù)組的地址計(jì)算:設(shè)一維數(shù)組為:A=(a1,a2,…,ai,…,an),數(shù)組中每個(gè)元素占size個(gè)存儲(chǔ)單元,則元素ai的存儲(chǔ)地址為:Loc(A[i])=Loc(A[1])+(i-1)*size。

數(shù)組的地址計(jì)算39數(shù)據(jù)結(jié)構(gòu)課件第5章數(shù)組和廣義表共64頁,您現(xiàn)在瀏覽的是第39頁!

⑶三維數(shù)組的地址計(jì)算

三維數(shù)組A(1:r,1:m,1:n)。假設(shè)每個(gè)數(shù)據(jù)元素占size個(gè)存儲(chǔ)單元,且以行序?yàn)橹餍虻倪M(jìn)行存儲(chǔ),首元素a111的地址為Loc(A[1][1][1]),求任意元素aijk的地址。

顯然,ai11地址為

Loc(A[i][1][1])=Loc(A[1][1][1])+(i-1)*m*n,因?yàn)樵谠撛刂坝衖-1個(gè)m*n的二維數(shù)組。40不難得到三維數(shù)組任意元素aijk的地址:Loc(A[i][j][k])=Loc(A[1][1][1])+((i-1)*m*n+(j-1)*n+(k-1))*size,其中:1≤i≤r,1≤j≤m,1≤k≤n。數(shù)據(jù)結(jié)構(gòu)課件第5章數(shù)組和廣義表共64頁,您現(xiàn)在瀏覽的是第40頁!特殊矩陣的壓縮存儲(chǔ)所謂壓縮存儲(chǔ)是指:為多個(gè)值相同的元素只分配一個(gè)存儲(chǔ)空間;對(duì)零元不分配空間。41稀疏矩陣的邏輯結(jié)構(gòu)稀疏矩陣的存儲(chǔ)結(jié)構(gòu)數(shù)據(jù)結(jié)構(gòu)課件第5章數(shù)組和廣義表共64頁,您現(xiàn)在瀏覽的是第41頁!

若一個(gè)n

階矩陣M

中的元素滿足下述性質(zhì)1.對(duì)稱矩陣aij=aji

1≤i,j≤n則稱為n

階對(duì)稱矩陣。42數(shù)據(jù)結(jié)構(gòu)課件第5章數(shù)組和廣義表共64頁,您現(xiàn)在瀏覽的是第42頁!

三角矩陣分為下三角矩陣和上三角矩陣。所謂下(上)三角矩陣是指矩陣的上(下)三角(不包括對(duì)角線)中的元均為常數(shù)c

或?yàn)榱愕膎

階矩陣。2.三角矩陣43下三角矩陣

三角矩陣除了和對(duì)稱矩陣一樣,只存儲(chǔ)矩陣的下(上)三角中的元之外,再加上一個(gè)存儲(chǔ)常數(shù)c

的存儲(chǔ)空間即可。上三角矩陣數(shù)據(jù)結(jié)構(gòu)課件第5章數(shù)組和廣義表共64頁,您現(xiàn)在瀏覽的是第43頁!在帶狀矩陣中,當(dāng)|i-j|>b

時(shí),aij=0。該方陣共有(2b+1)n-(b+1)b

個(gè)非零元素。a11D=a12a1300a21a22a23a240a31a32a33a34a350a42a43a44a4500a53a54a55

D

矩陣是一個(gè)5階、半帶寬為2的帶狀矩陣,在其主對(duì)角線a11、a22、a33、a44、a55上下各有2條對(duì)角線,共有(2b+1)n-(b+1)b=19個(gè)非零元素。44例如:數(shù)據(jù)結(jié)構(gòu)課件第5章數(shù)組和廣義表共64頁,您現(xiàn)在瀏覽的是第44頁!

1.確定存儲(chǔ)該矩陣所需的一維向量空間的大小除行和最后一行只有兩個(gè)元素外,其余各行均有3個(gè)非零元素,由此得到一維向量所需的空間大小為:3n-2

2.確定非零元素在一維數(shù)組空間中的位置Loc(a[i][j])=Loc(a[1][1])+2(i-1)+j-145

三對(duì)角帶狀矩陣的壓縮存儲(chǔ),以行序?yàn)橹餍蜻M(jìn)行存儲(chǔ),且只存儲(chǔ)非零元素。其方法為數(shù)據(jù)結(jié)構(gòu)課件第5章數(shù)組和廣義表共64頁,您現(xiàn)在瀏覽的是第45頁!按照壓縮存儲(chǔ)的概念,只存儲(chǔ)稀疏矩陣的非零元素。因此,除了存儲(chǔ)非零元素的值aij

之外,還必須同時(shí)記下非零元素所在矩陣的行i號(hào)和列j號(hào)。反之,一個(gè)三元組(i,j,aij)唯一確定了矩陣的一個(gè)非零元素。因此,稀疏矩陣可以由表示非零元的三元組及其矩陣的總的行列數(shù)唯一確定。假設(shè)以順序存儲(chǔ)結(jié)構(gòu)表示三元組表,則可以得到稀疏矩陣的一種壓縮存儲(chǔ)方式,這種方式稱之為三元組順序表。46 5.3.3稀疏矩陣的存儲(chǔ)結(jié)構(gòu)1.三元組順序表數(shù)據(jù)結(jié)構(gòu)課件第5章數(shù)組和廣義表共64頁,您現(xiàn)在瀏覽的是第46頁!#defineMAXSIZE 1000//假設(shè)非零元個(gè)數(shù)的最大值為1000typedefstruct{ //三元組順序表的元素結(jié)構(gòu)定義int row,;col //該非零元的行下標(biāo)和列下標(biāo)

ElementTypee; //該非零元的值}Triple;typedefstruct{ //三元組順序表存儲(chǔ)結(jié)構(gòu)定義Tripledata[MAXSIZE+1];//非零元三元組表,data[0]未用

int m,n,len; //矩陣的行數(shù)、列數(shù)和非零個(gè)數(shù)}TSMatrix; //三元組順序表的類型名47(1)三元組順序存儲(chǔ)表示

在這里,data域中表示非零元的三元組是以行序?yàn)橹餍蝽樞蚺帕械?。?shù)據(jù)結(jié)構(gòu)課件第5章數(shù)組和廣義表共64頁,您現(xiàn)在瀏覽的是第47頁!(2)利用三元組順序表實(shí)現(xiàn)矩陣的轉(zhuǎn)置運(yùn)算 將矩陣的行列值相互交互;在這3點(diǎn)中,最關(guān)鍵的是第3條,即如何使B.data中的三元組以T的行(M的列)為主序依次排列。48顯然,一個(gè)稀疏矩陣的轉(zhuǎn)置矩陣仍是稀疏矩陣。假設(shè)A

和B

是TSMatrix(三元組順序表)類型變量,分別表示矩陣M和其轉(zhuǎn)置矩陣T。那么,只要做到下面3點(diǎn)就可以由A

得到B,實(shí)現(xiàn)矩陣的轉(zhuǎn)置。 將每三元組中的row

和col

相互調(diào)換; 重排三元組之間的次序。數(shù)據(jù)結(jié)構(gòu)課件第5章數(shù)組和廣義表共64頁,您現(xiàn)在瀏覽的是第48頁!使b.data中的三元組以T

的行(M

的列)為主序依次排列的方法有如下兩種:49方法一:按照B.data中三元組的次序,依次在a.data中找到相應(yīng)的三元組進(jìn)行轉(zhuǎn)置。方法二:按照A.data中三元組的次序進(jìn)行轉(zhuǎn)置,并將轉(zhuǎn)置后的三元組置入B.data中恰當(dāng)?shù)奈恢谩2捎梅椒ㄒ粩?shù)據(jù)結(jié)構(gòu)課件第5章數(shù)組和廣義表共64頁,您現(xiàn)在瀏覽的是第49頁!

轉(zhuǎn)置的三元組表B->data原始的三元組表A.datar

c

v

1

2

12

1

3

9

3

1

-3

3

6

14

4

3

24

5

2

18

6

1

15

6

4

-750利用三元組順序表存儲(chǔ)實(shí)現(xiàn)矩陣的轉(zhuǎn)置c

36151463r

11223346v

-3151218924-714

數(shù)據(jù)結(jié)構(gòu)課件第5章數(shù)組和廣義表共64頁,您現(xiàn)在瀏覽的是第50頁!for(k=1;k<=A.n;k++) for(i=1;i<=A.len;i++) if(A.data[i].col==k){ //進(jìn)行轉(zhuǎn)置

returnOK;}//TransposeSMatrix B->data[j].row=A.data[i].col; //稀疏矩陣A的列域值成為其轉(zhuǎn)置矩陣B

的行域值 B->data[j].col=A.data[i].row; //稀疏矩陣A

的行域值成為其轉(zhuǎn)置矩陣M

的列域值 B->data[j].e=A.data[i].e; //將稀疏矩陣M

的非零元值賦給其轉(zhuǎn)置矩陣T

j++; //B->data中三元組的序號(hào)加1 }//if(A.data)結(jié)束}//if(B->len>0)結(jié)束51數(shù)據(jù)結(jié)構(gòu)課件第5章數(shù)組和廣義表共64頁,您現(xiàn)在瀏覽的是第51頁!52當(dāng)矩陣M

中非零元個(gè)數(shù)幾乎和矩陣元素個(gè)數(shù)相等時(shí),即len

和m×n等數(shù)量級(jí)時(shí),算法時(shí)間復(fù)雜度就為O(m×n2),雖然節(jié)省了存儲(chǔ)空間,但時(shí)間復(fù)雜度提高了。由此可見,上述求轉(zhuǎn)置矩陣算法只適合于len<<m×n

的情況。數(shù)據(jù)結(jié)構(gòu)課件第5章數(shù)組和廣義表共64頁,您現(xiàn)在瀏覽的是第52頁!(1)稀疏矩陣的十字鏈表存儲(chǔ)表示

矩陣中非零元的行號(hào)row;

矩陣中非零元的列號(hào)col;

矩陣中非零元的值e;

向右域right,用以鏈接同一行中下一個(gè)非零元;

向下域down,用以鏈接同一列中下一個(gè)非零元。53rowdowncolvalueright非零元行號(hào)非零元列號(hào)非零元的值向下域向右域在鏈表中,矩陣的非零元素可用如下結(jié)點(diǎn)表示:同一行的非零元通過right域鏈接成一個(gè)線性鏈表,同一列的非零元通過down域鏈接成一個(gè)線性鏈表,每個(gè)非零元Mij既是第i個(gè)行鏈表中的一個(gè)結(jié)點(diǎn),又是第j個(gè)列鏈表中的一個(gè)結(jié)點(diǎn),整個(gè)矩陣構(gòu)成了一個(gè)十字交叉的鏈表,故稱這樣的存儲(chǔ)結(jié)構(gòu)為十字鏈表。數(shù)據(jù)結(jié)構(gòu)課件第5章數(shù)組和廣義表共64頁,您現(xiàn)在瀏覽的是第53頁!3020-10500000113145∧22-1∧312∧M.col_headM.row_head∧∧∧∧54數(shù)據(jù)結(jié)構(gòu)課件第5章數(shù)組和廣義表共64頁,您現(xiàn)在瀏覽的是第54頁!for(scanf(&i,&j,&e);i!=0;scanf(&i,&j,&e)){//按任意次序輸入非零元if(!(p=(OLNode*)malloc(sizeof(OLNode)))) exit(OVERFLOW);p->row=i; //生成新結(jié)點(diǎn)的行號(hào)域p->col=j; //生成新結(jié)點(diǎn)的列號(hào)域p->value=e; //生成新結(jié)點(diǎn)的值域55M->row_head[]=NULL;//初始化行頭指針向量;令各行鏈表為空鏈表M->col_head[]=NULL;//初始化列頭指針向量;令各列鏈表為空鏈表數(shù)據(jù)結(jié)構(gòu)課件第5章數(shù)組和廣義表共64頁,您現(xiàn)在瀏覽的是第55頁!if(M->col_head[j]==NULL){ M_col_head[j]=p;p->down=NULL;}else{for(q=M->col_head[j];(q->down)&&q->down->row<

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論