![數(shù)據(jù)結(jié)構(gòu) 數(shù)組矩陣_第1頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/21/420c23fc-8011-46a4-b949-828772f89b06/420c23fc-8011-46a4-b949-828772f89b061.gif)
![數(shù)據(jù)結(jié)構(gòu) 數(shù)組矩陣_第2頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/21/420c23fc-8011-46a4-b949-828772f89b06/420c23fc-8011-46a4-b949-828772f89b062.gif)
![數(shù)據(jù)結(jié)構(gòu) 數(shù)組矩陣_第3頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/21/420c23fc-8011-46a4-b949-828772f89b06/420c23fc-8011-46a4-b949-828772f89b063.gif)
![數(shù)據(jù)結(jié)構(gòu) 數(shù)組矩陣_第4頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/21/420c23fc-8011-46a4-b949-828772f89b06/420c23fc-8011-46a4-b949-828772f89b064.gif)
![數(shù)據(jù)結(jié)構(gòu) 數(shù)組矩陣_第5頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/21/420c23fc-8011-46a4-b949-828772f89b06/420c23fc-8011-46a4-b949-828772f89b065.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、數(shù)據(jù)結(jié)構(gòu)與算法課程實驗報告 實驗三:稀疏矩陣的壓縮存儲及運算 姓名:沈靖雯 班級:14信息與計算科學(xué)(2)班 學(xué)號:2014326601094實驗三 稀疏矩陣的壓縮存儲及運算【實驗內(nèi)容】 實現(xiàn)稀疏矩陣的壓縮存儲方法以及在特定存儲方法下的基本運算。【實驗?zāi)康摹?掌握數(shù)組的應(yīng)用,包括稀疏矩陣、特殊矩陣的壓縮存儲方法。矩陣的基本運算的實現(xiàn),包括矩陣相加、轉(zhuǎn)置、乘法等。【問題描述】 (1) 用行邏輯鏈接順序表或十字鏈表分別實現(xiàn)稀疏矩陣的壓縮存儲。(2) 編程實現(xiàn)矩陣的轉(zhuǎn)置運算和乘法運算(運用行邏輯鏈接順序表或十字鏈表作為存儲結(jié)構(gòu))。【問題實現(xiàn)】(1)抽象數(shù)據(jù)類型ADT RLSMatrix 數(shù)據(jù)對象:
2、數(shù)據(jù)關(guān)系: =Î= - 基本操作: CreateMatrix(*M) 操作結(jié)果:創(chuàng)建稀疏矩陣M。 Trans(M,*T) 初始條件:稀疏矩陣M已存在。 操作結(jié)果:求稀疏矩陣M的轉(zhuǎn)置矩陣T。 Mult(M,N,*T) 初始條件:稀疏矩陣M的列數(shù)等于稀疏矩陣N的行數(shù)。 操作結(jié)果:求稀疏矩陣乘積T=M*N。 Show(M) 初始條件:稀疏矩陣M已存在且非空。 操作結(jié)果:輸出稀疏矩陣M。 ADT RLSMatrix (2)主要實現(xiàn)思路和程序代碼: 1).首先定義抽象數(shù)據(jù)類型,構(gòu)建程序框架; 2).定義稀疏矩陣創(chuàng)建函數(shù); void CreateMatrix(RLSMatrix *M) 用戶首先
3、輸入矩陣行數(shù)、列數(shù)、非零元個數(shù)后再依次輸入非零元行數(shù)、列數(shù)、值,完成稀疏矩陣創(chuàng)建;scanf("%d %d %d",&M->mu,&M->nu,&M->tu); /判斷行值、列值、元素個數(shù)是否合法 if(M->mu<=0)|(M->nu<=0)|(M->tu<=0)|(M->tu>M->mu*M->nu) printf("輸入有誤!"); int k; printf("請輸入非零元的行坐標(biāo) 列坐標(biāo) 值:n"); for(k=1;k&l
4、t;=M->tu;k+) /輸入稀疏矩陣元素 scanf("%d %d %d",&M->datak.i,&M->datak.j,&M->datak.e); /for 在稀疏矩陣創(chuàng)建函數(shù)中加入num和rpos兩個向量的定義,前者記錄稀疏矩陣每行非零元個數(shù),后者記錄每行第一個非零元所在矩陣的位置,為后續(xù)矩陣運算函數(shù)所用。if(M->tu) int num1000,t; for(col=1;col<=M->mu;+col) numcol=0; for(t=1;t<=M->tu;+t) +numM->
5、;datat.i; /求出M中每行非零元個數(shù)M->rpos1=1; /求矩陣M第col行第一個非零元在M.data中的位置 for(col=2;col<=M->mu;+col) M->rposcol=M->rposcol-1+numcol-1; 3).定義矩陣轉(zhuǎn)置函數(shù);int Trans(RLSMatrix M,RLSMatrix *T)快速轉(zhuǎn)置法完成矩陣轉(zhuǎn)置操作:if(T->tu)int q=1,t,p;int num1000; for(col=1;col<=M.nu;+col) numcol=0; for(t=1;t<=M.tu;+t) +n
6、umM.datat.j; /求出M中每列非零元個數(shù)T->rpos1=1; /求矩陣M第col列(=矩陣T第col行)第一個非零元在T.data中的位置 for(col=2;col<=M.nu;+col) T->rposcol=T->rposcol-1+numcol-1; for(p=1;p<=M.tu;+p) col=M.datap.j; q=T->rposcol; T->dataq.i=M.datap.j; T->dataq.j=M.datap.i; T->dataq.e=M.datap.e; +T->rposcol; 4).使用行
7、邏輯鏈接順序表存儲定義矩陣乘積函數(shù); int Mult(RLSMatrix M,RLSMatrix N,RLSMatrix *T) 規(guī)定矩陣M的列數(shù)等于矩陣N的行數(shù),方可進行矩陣乘法操作。具體代碼如下:if(M.tu*N.tu!=0)for(arow=1;arow<=M.mu;+arow)int ctemp1000;for(i=1;i<=T->nu;+i)ctempi=0;T->rposarow=T->tu+1;if(arow<M.mu) tp=M.rposarow+1; else tp=M.tu+1; for(p=M.rposarow;p<tp;+p
8、) brow=M.datap.j; if(brow<N.mu) t=N.rposbrow+1; else t=N.tu+1; for(q=N.rposbrow;q<t;+q) ccol=N.dataq.j; ctempccol+=M.datap.e*N.dataq.e; for(ccol=1;ccol<=T->nu;+ccol) if(ctempccol) if(+T->tu>SIZE) return ERROR; T->dataT->tu.i=arow; T->dataT->tu.j=ccol;T->dataT->tu.
9、e=ctempccol; 5).定義矩陣輸出函數(shù)輸出矩陣;void Show(RLSMatrix M)通過雙重循環(huán),把稀疏矩陣中不為零的元素的行數(shù)、列數(shù)和值顯示出來: for(col=1;col<=M.mu;col+) for(p=1;p<=M.tu;p+) if(M.datap.i=col) printf("%3d %3d %3dn",M.datap.i,M.datap.j,M.datap.e); 6).定義主函數(shù),總體完成以上所有函數(shù)功能的實現(xiàn)。 程序運行如圖1:圖 1【總結(jié)】 實驗結(jié)果基本實現(xiàn)問題要求。 在實驗調(diào)試過程中主要出現(xiàn)了兩個問題: 1.在定義函數(shù)
10、時一開始照著書上定義矩陣變量,但程序總是報錯;后來直接換成指針才得以解決; 2.在處理矩陣乘積函數(shù)時,函數(shù)測試結(jié)果總是出現(xiàn)問題,經(jīng)過幾次思考發(fā)現(xiàn)是num和rpos在該函數(shù)中不曾定義而直接使用導(dǎo)致問題,為避免重復(fù)定義,故將這兩個向量定義到矩陣創(chuàng)建函數(shù)中(void CreateMatrix(RLSMatrix *M))才得以解決問題。附件:源代碼:#include <stdio.h> #include <stdlib.h> #define ERROR -1 #define SIZE 12500int col;int ccol,arow,brow;typedef struct
11、 int i,j; / 非零元行下標(biāo)和列下標(biāo) int e; Triple; typedef struct Triple dataSIZE+1; / data0未用 int rposSIZE+1;int mu,nu,tu; /矩陣行數(shù)、列數(shù)、非零元個數(shù) RLSMatrix; /采用三元組順序表存儲表示,創(chuàng)建稀疏矩陣Mvoid CreateMatrix(RLSMatrix *M) scanf("%d %d %d",&M->mu,&M->nu,&M->tu); /判斷行值、列值、元素個數(shù)是否合法 if(M->mu<=0)|(M
12、->nu<=0)|(M->tu<=0)|(M->tu>M->mu*M->nu) printf("輸入有誤!"); int k; printf("請輸入非零元的行坐標(biāo) 列坐標(biāo) 值:n"); for(k=1;k<=M->tu;k+) /輸入稀疏矩陣元素 scanf("%d %d %d",&M->datak.i,&M->datak.j,&M->datak.e); /for if(M->tu) int num1000,t; for(co
13、l=1;col<=M->mu;+col) numcol=0; for(t=1;t<=M->tu;+t) +numM->datat.i; /求出M中每行非零元個數(shù)M->rpos1=1; /求矩陣M第col行第一個非零元在M.data中的位置 for(col=2;col<=M->mu;+col) M->rposcol=M->rposcol-1+numcol-1; /行邏輯順序存儲快速轉(zhuǎn)置 int Trans(RLSMatrix M,RLSMatrix *T)T->mu=M.nu;T->nu=M.mu;T->tu=M.tu
14、;if(T->tu)int q=1,t,p;int num1000; for(col=1;col<=M.nu;+col) numcol=0; for(t=1;t<=M.tu;+t) +numM.datat.j; /求出M中每列非零元個數(shù)T->rpos1=1; /求矩陣M第col列(=矩陣T第col行)第一個非零元在T.data中的位置 for(col=2;col<=M.nu;+col) T->rposcol=T->rposcol-1+numcol-1; for(p=1;p<=M.tu;+p) col=M.datap.j; q=T->rpos
15、col; T->dataq.i=M.datap.j; T->dataq.j=M.datap.i; T->dataq.e=M.datap.e; +T->rposcol; return 0;/求矩陣乘積T=M*N,行邏輯鏈接順序表存儲int Mult(RLSMatrix M,RLSMatrix N,RLSMatrix *T)if(N.mu!=M.nu) return ERROR;T->mu=M.mu;T->nu=N.nu;T->tu=0;int tp,t,p,q,i;if(M.tu*N.tu!=0)for(arow=1;arow<=M.mu;+aro
16、w)int ctemp1000;for(i=1;i<=T->nu;+i)ctempi=0;T->rposarow=T->tu+1;if(arow<M.mu) tp=M.rposarow+1; else tp=M.tu+1; for(p=M.rposarow;p<tp;+p) brow=M.datap.j; if(brow<N.mu) t=N.rposbrow+1; else t=N.tu+1; for(q=N.rposbrow;q<t;+q) ccol=N.dataq.j; ctempccol+=M.datap.e*N.dataq.e; for(
17、ccol=1;ccol<=T->nu;+ccol) if(ctempccol) if(+T->tu>SIZE) return ERROR; T->dataT->tu.i=arow; T->dataT->tu.j=ccol;T->dataT->tu.e=ctempccol; return 0;/輸出矩陣 void Show(RLSMatrix M)/通過雙重循環(huán),把稀疏矩陣中不為零的元素的行數(shù)、列數(shù)和值顯示出來 int p; for(col=1;col<=M.mu;col+) for(p=1;p<=M.tu;p+) if(M.datap.i=col) printf("%3d %3d %3dn",M.datap.i,M.datap.j,M.datap.e);int main()RLSMatrix M,N,T,Q; printf("請輸入矩陣M的(行數(shù) 列數(shù) 非零元個數(shù)):n");
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度教育產(chǎn)業(yè)再擔(dān)保合同模板
- 2025年度互聯(lián)網(wǎng)數(shù)據(jù)中心IDC建設(shè)合同大全
- 貧困戶低保申請書范文
- 2025年度區(qū)域代理商信息保密及知識產(chǎn)權(quán)保護合同
- 2025年度工業(yè)地產(chǎn)租賃管理合同
- 2025年度時尚服飾廣告宣傳服務(wù)合同
- 2025年度住宅小區(qū)水電暖設(shè)施更新?lián)Q代施工承包合同范本
- 2025年度區(qū)塊鏈技術(shù)應(yīng)用預(yù)付款授權(quán)合同
- 電商行業(yè)趨勢分析與未來戰(zhàn)略規(guī)劃
- 流量控制策略在移動網(wǎng)絡(luò)教育中的應(yīng)用研究
- Unit4MyfamilyStorytime(課件)人教新起點英語三年級下冊
- 《麥田怪圈探密》課件
- 物流運作管理-需求預(yù)測
- 《電機與電氣控制(第三版)習(xí)題冊》 習(xí)題答案
- 鋼桁梁頂推施工方案
- 醫(yī)療器械采購方案投標(biāo)方案(完整技術(shù)標(biāo))
- 交通運輸安全工作調(diào)研報告
- 旅行社導(dǎo)游合同
- 2023年四川省自貢市中考數(shù)學(xué)真題(原卷版)
- 室內(nèi)鋼結(jié)構(gòu)隔層施工合同
- 榮威iMAX8汽車說明書
評論
0/150
提交評論