版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、數(shù)據(jù)結(jié)構(gòu)與算法課程實(shí)驗(yàn)報(bào)告 實(shí)驗(yàn)三:稀疏矩陣的壓縮存儲(chǔ)及運(yùn)算 姓名:沈靖雯 班級(jí):14信息與計(jì)算科學(xué)(2)班 學(xué)號(hào):2014326601094實(shí)驗(yàn)三 稀疏矩陣的壓縮存儲(chǔ)及運(yùn)算【實(shí)驗(yàn)內(nèi)容】 實(shí)現(xiàn)稀疏矩陣的壓縮存儲(chǔ)方法以及在特定存儲(chǔ)方法下的基本運(yùn)算?!緦?shí)驗(yàn)?zāi)康摹?掌握數(shù)組的應(yīng)用,包括稀疏矩陣、特殊矩陣的壓縮存儲(chǔ)方法。矩陣的基本運(yùn)算的實(shí)現(xiàn),包括矩陣相加、轉(zhuǎn)置、乘法等?!締栴}描述】 (1) 用行邏輯鏈接順序表或十字鏈表分別實(shí)現(xiàn)稀疏矩陣的壓縮存儲(chǔ)。(2) 編程實(shí)現(xiàn)矩陣的轉(zhuǎn)置運(yùn)算和乘法運(yùn)算(運(yùn)用行邏輯鏈接順序表或十字鏈表作為存儲(chǔ)結(jié)構(gòu))。【問題實(shí)現(xiàn)】(1)抽象數(shù)據(jù)類型ADT RLSMatrix 數(shù)據(jù)對(duì)象:
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)主要實(shí)現(xiàn)思路和程序代碼: 1).首先定義抽象數(shù)據(jù)類型,構(gòu)建程序框架; 2).定義稀疏矩陣創(chuàng)建函數(shù); void CreateMatrix(RLSMatrix *M) 用戶首先
3、輸入矩陣行數(shù)、列數(shù)、非零元個(gè)數(shù)后再依次輸入非零元行數(shù)、列數(shù)、值,完成稀疏矩陣創(chuàng)建;scanf("%d %d %d",&M->mu,&M->nu,&M->tu); /判斷行值、列值、元素個(gè)數(shù)是否合法 if(M->mu<=0)|(M->nu<=0)|(M->tu<=0)|(M->tu>M->mu*M->nu) printf("輸入有誤!"); int k; printf("請(qǐng)輸入非零元的行坐標(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兩個(gè)向量的定義,前者記錄稀疏矩陣每行非零元個(gè)數(shù),后者記錄每行第一個(gè)非零元所在矩陣的位置,為后續(xù)矩陣運(yùn)算函數(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中每行非零元個(gè)數(shù)M->rpos1=1; /求矩陣M第col行第一個(gè)非零元在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中每列非零元個(gè)數(shù)T->rpos1=1; /求矩陣M第col列(=矩陣T第col行)第一個(gè)非零元在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、邏輯鏈接順序表存儲(chǔ)定義矩陣乘積函數(shù); int Mult(RLSMatrix M,RLSMatrix N,RLSMatrix *T) 規(guī)定矩陣M的列數(shù)等于矩陣N的行數(shù),方可進(jìn)行矩陣乘法操作。具體代碼如下: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ù)功能的實(shí)現(xiàn)。 程序運(yùn)行如圖1:圖 1【總結(jié)】 實(shí)驗(yàn)結(jié)果基本實(shí)現(xiàn)問題要求。 在實(shí)驗(yàn)調(diào)試過程中主要出現(xiàn)了兩個(gè)問題: 1.在定義函數(shù)
10、時(shí)一開始照著書上定義矩陣變量,但程序總是報(bào)錯(cuò);后來直接換成指針才得以解決; 2.在處理矩陣乘積函數(shù)時(shí),函數(shù)測(cè)試結(jié)果總是出現(xiàn)問題,經(jīng)過幾次思考發(fā)現(xiàn)是num和rpos在該函數(shù)中不曾定義而直接使用導(dǎo)致問題,為避免重復(fù)定義,故將這兩個(gè)向量定義到矩陣創(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ù)、非零元個(gè)數(shù) RLSMatrix; /采用三元組順序表存儲(chǔ)表示,創(chuàng)建稀疏矩陣Mvoid CreateMatrix(RLSMatrix *M) scanf("%d %d %d",&M->mu,&M->nu,&M->tu); /判斷行值、列值、元素個(gè)數(shù)是否合法 if(M->mu<=0)|(M
12、->nu<=0)|(M->tu<=0)|(M->tu>M->mu*M->nu) printf("輸入有誤!"); int k; printf("請(qǐng)輸入非零元的行坐標(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中每行非零元個(gè)數(shù)M->rpos1=1; /求矩陣M第col行第一個(gè)非零元在M.data中的位置 for(col=2;col<=M->mu;+col) M->rposcol=M->rposcol-1+numcol-1; /行邏輯順序存儲(chǔ)快速轉(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中每列非零元個(gè)數(shù)T->rpos1=1; /求矩陣M第col列(=矩陣T第col行)第一個(gè)非零元在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,行邏輯鏈接順序表存儲(chǔ)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("請(qǐng)輸入矩陣M的(行數(shù) 列數(shù) 非零元個(gè)數(shù)):n");
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025版購車貸款利率調(diào)整合同3篇
- 金融服務(wù)工程承諾書
- 環(huán)保設(shè)備采購招投標(biāo)合同范本
- 建筑工程腳手架租賃合同范本
- 律師協(xié)會(huì)財(cái)務(wù)風(fēng)險(xiǎn)管理規(guī)范
- 資金運(yùn)用監(jiān)控規(guī)范
- 眼鏡生產(chǎn)廠房租賃合同
- 非營利組織安全責(zé)任區(qū)管理辦法
- 體育產(chǎn)業(yè)招投標(biāo)領(lǐng)導(dǎo)小組啟動(dòng)
- 垃圾處理安全事故防范指南
- 德菲婭定制衣柜導(dǎo)購培訓(xùn)手冊(cè)
- 人文英語3復(fù)習(xí)資料
- 2023-2024學(xué)年云南省昆明市小學(xué)語文二年級(jí)期末評(píng)估測(cè)試題附參考答案和詳細(xì)解析
- 靜脈輸液新標(biāo)準(zhǔn)
- 機(jī)械原理課程設(shè)計(jì)-自動(dòng)蓋章機(jī)
- 供應(yīng)室提高腔鏡器械清洗質(zhì)量PDCA案例
- 【林芝市藏漢通婚帶來的影響調(diào)研分析報(bào)告3300字】
- FURUNOECDISMultipleChoiceTest古野電子海圖題庫測(cè)試題
- 中醫(yī)骨傷學(xué)課程教案
- 央國企信創(chuàng)白皮書 -基于信創(chuàng)體系的數(shù)字化轉(zhuǎn)型
- JJF 1596-2016X射線工業(yè)實(shí)時(shí)成像系統(tǒng)校準(zhǔn)規(guī)范
評(píng)論
0/150
提交評(píng)論