




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)
文檔簡介
1、/*數(shù)據(jù)結(jié)構(gòu)C語言版 稀疏矩陣的三元組順序表存儲表示和實現(xiàn) P98編譯環(huán)境:Dev-C+ 4.9.9.2日期:2011年2月8日 */typedef int ElemType;/ 稀疏矩陣的三元組順序表存儲表示 #define MAXSIZE 100 / 非零元個數(shù)的最大值 typedef structint i,j;/ 行下標(biāo),列下標(biāo) ElemType e; / 非零元素值 Triple;typedef structTriple dataMAXSIZE+1; / 非零元三元組表,data0未用 int mu,nu,tu;/ 矩陣的行數(shù)、列數(shù)和非零元個數(shù) TSMatrix;/ 創(chuàng)建稀疏矩陣Mi
2、nt CreateSMatrix(TSMatrix *M)int i,m,n;ElemType e;int k;printf("請輸入矩陣的行數(shù),列數(shù),非零元素個數(shù):(逗號)n");scanf("%d,%d,%d",&(*M).mu,&(*M).nu,&(*M).tu);(*M).data0.i=0;/ 為以下比較順序做準(zhǔn)備 for(i = 1; i <= (*M).tu; i+)doprintf("請按行序順序輸入第%d個非零元素所在的行(1%d),""列(1%d),元素值:(逗號)n&quo
3、t;, i,(*M).mu,(*M).nu);scanf("%d,%d,%d",&m,&n,&e);k=0;/ 行或列超出范圍 if(m < 1 | m > (*M).mu | n < 1 | n > (*M).nu) k=1;if(m < (*M).datai-1.i | m = (*M).datai-1.i&& n <= (*M).datai-1.j) / 行或列的順序有錯 k=1;while(k);(*M).datai.i = m;/行下標(biāo)(*M).datai.j = n;/列下標(biāo)(*M).d
4、atai.e = e;/該下標(biāo)所對應(yīng)的值return 1;/ 銷毀稀疏矩陣M,所有元素置空void DestroySMatrix(TSMatrix *M) (*M).mu=0;(*M).nu=0;(*M).tu=0;/ 輸出稀疏矩陣Mvoid PrintSMatrix(TSMatrix M)int i;printf("n%d行%d列%d個非零元素。n",M.mu,M.nu,M.tu);printf("%4s%4s%8sn", "行", "列", "元素值");for(i=1;i<=M.tu
5、;i+)printf("%4d%4d%8dn",M.datai.i,M.datai.j,M.datai.e);/ 由稀疏矩陣M復(fù)制得到Tint CopySMatrix(TSMatrix M,TSMatrix *T) (*T)=M;return 1;/ AddSMatrix函數(shù)要用到int comp(int c1,int c2) int i;if(c1<c2)i=1;else if(c1=c2)i=0;elsei=-1;return i;/ 求稀疏矩陣的和Q=M+Nint AddSMatrix(TSMatrix M,TSMatrix N,TSMatrix *Q) Tri
6、ple *Mp,*Me,*Np,*Ne,*Qh,*Qe;if(M.mu!=N.mu)return 0;if(M.nu!=N.nu)return 0;(*Q).mu=M.mu;(*Q).nu=M.nu;Mp=&M.data1;/ Mp的初值指向矩陣M的非零元素首地址 Np=&N.data1;/ Np的初值指向矩陣N的非零元素首地址 Me=&M.dataM.tu;/ Me指向矩陣M的非零元素尾地址 Ne=&N.dataN.tu;/ Ne指向矩陣N的非零元素尾地址 Qh=Qe=(*Q).data;/ Qh、Qe的初值指向矩陣Q的非零元素首地址的前一地址 while(M
7、p <= Me && Np <= Ne)Qe+;switch(comp(Mp->i,Np->i)case 1: *Qe=*Mp;Mp+;break;case 0: / M、N矩陣當(dāng)前非零元素的行相等,繼續(xù)比較列switch(comp(Mp->j,Np->j) case 1: *Qe=*Mp;Mp+;break;case 0: *Qe=*Mp;Qe->e+=Np->e;if(!Qe->e) / 元素值為0,不存入壓縮矩陣 Qe-;Mp+;Np+;break;case -1: *Qe=*Np;Np+;break;case -1:
8、 *Qe=*Np;Np+;if(Mp>Me) / 矩陣M的元素全部處理完畢 while(Np<=Ne)Qe+;*Qe=*Np;Np+;if(Np>Ne) / 矩陣N的元素全部處理完畢 while(Mp<=Me)Qe+;*Qe=*Mp;Mp+;(*Q).tu=Qe-Qh; / 矩陣Q的非零元素個數(shù) return 1;/ 求稀疏矩陣的差Q=M-Nint SubtSMatrix(TSMatrix M,TSMatrix N,TSMatrix *Q) int i;for(i=1;i<=N.tu;i+)N.datai.e*=-1;AddSMatrix(M,N,Q);retur
9、n 1;/ 求稀疏矩陣的乘積Q=M*Nint MultSMatrix(TSMatrix M,TSMatrix N,TSMatrix *Q) int i,j,h=M.mu,l=N.nu,Qn=0;/ h,l分別為矩陣Q的行、列值,Qn為矩陣Q的非零元素個數(shù),初值為0 ElemType *Qe;if(M.nu!=N.mu)return 0;(*Q).mu=M.mu;(*Q).nu=N.nu;Qe=(ElemType *)malloc(h*l*sizeof(ElemType); / Qe為矩陣Q的臨時數(shù)組 / 矩陣Q的第i行j列的元素值存于*(Qe+(i-1)*l+j-1)中,初值為0 for(i=
10、0;i<h*l;i+)*(Qe+i)=0; / 賦初值0 for(i=1;i<=M.tu;i+) / 矩陣元素相乘,結(jié)果累加到Qe for(j=1;j<=N.tu;j+)if(M.datai.j=N.dataj.i)*(Qe+(M.datai.i-1)*l+N.dataj.j-1) +=M.datai.e * N.dataj.e;for(i=1;i<=M.mu;i+)for(j=1;j<=N.nu;j+)if(*(Qe+(i-1)*l+j-1)!=0)Qn+;(*Q).dataQn.e=*(Qe+(i-1)*l+j-1);(*Q).dataQn.i=i;(*Q).
11、dataQn.j=j;free(Qe);(*Q).tu=Qn;return 1;/ 算法5.1 P99/ 求稀疏矩陣M的轉(zhuǎn)置矩陣T。int TransposeSMatrix(TSMatrix M,TSMatrix *T)int p,q,col;(*T).mu=M.nu;(*T).nu=M.mu;(*T).tu=M.tu;if(*T).tu)q=1;for(col=1;col<=M.nu;+col)/先將列轉(zhuǎn)換成行for(p=1;p<=M.tu;+p)/再將行轉(zhuǎn)換成列if(M.datap.j=col)(*T).dataq.i=M.datap.j;(*T).dataq.j=M.data
12、p.i;(*T).dataq.e=M.datap.e;+q;return 1;/ 算法5.2 P100/ 快速求稀疏矩陣M的轉(zhuǎn)置矩陣T。int FastTransposeSMatrix(TSMatrix M,TSMatrix *T) int p,q,t,col,*num,*cpot;num=(int *)malloc(M.nu+1)*sizeof(int);/ 生成數(shù)組(0不用) cpot=(int *)malloc(M.nu+1)*sizeof(int);/ 生成數(shù)組(0不用) (*T).mu=M.nu;(*T).nu=M.mu;(*T).tu=M.tu;if(*T).tu)for(col=
13、1;col<=M.nu;+col)numcol=0; / 設(shè)初值 for(t=1;t<=M.tu;+t) / 求M中每一列含非零元素個數(shù) +numM.datat.j;cpot1=1;/ 求第col列中第一個非零元在(*T).data中的序號for(col=2;col<=M.nu;+col) cpotcol=cpotcol-1+numcol-1;for(p=1;p<=M.tu;+p)col=M.datap.j;q=cpotcol;(*T).dataq.i=M.datap.j;(*T).dataq.j=M.datap.i;(*T).dataq.e=M.datap.e;+cp
14、otcol;free(num);free(cpot);return 1;int main()TSMatrix A,B,C;printf("創(chuàng)建矩陣A: ");CreateSMatrix(&A);PrintSMatrix(A);printf("由矩陣A復(fù)制矩陣B: ");CopySMatrix(A,&B);PrintSMatrix(B);DestroySMatrix(&B);printf("銷毀矩陣B后:n");PrintSMatrix(B);printf("重創(chuàng)矩陣B:(注意與矩陣A的行、列數(shù)相同,這
15、樣方便后面的測試""行、列分別為%d,%d)n", A.mu, A.nu);CreateSMatrix(&B);PrintSMatrix(B);printf("矩陣C1(A+B): ");AddSMatrix(A,B,&C);PrintSMatrix(C);DestroySMatrix(&C);printf("矩陣C2(A-B): ");SubtSMatrix(A,B,&C);PrintSMatrix(C);DestroySMatrix(&C);printf("矩陣C3(A的
16、轉(zhuǎn)置): ");TransposeSMatrix(A,&C);PrintSMatrix(C);DestroySMatrix(&A);DestroySMatrix(&B);DestroySMatrix(&C);printf("創(chuàng)建矩陣A2: ");CreateSMatrix(&A);PrintSMatrix(A);printf("創(chuàng)建矩陣B3:(行數(shù)應(yīng)與矩陣A2的列數(shù)相同=%d)n",A.nu);CreateSMatrix(&B);PrintSMatrix(B);printf("矩陣C5(
17、A*B): ");MultSMatrix(A,B,&C);PrintSMatrix(C);DestroySMatrix(&A);DestroySMatrix(&B);DestroySMatrix(&C);printf("創(chuàng)建矩陣A: ");CreateSMatrix(&A);PrintSMatrix(A);FastTransposeSMatrix(A,&B);printf("矩陣B(A的快速轉(zhuǎn)置): ");PrintSMatrix(B);DestroySMatrix(&A);Destroy
18、SMatrix(&B);system("pause");return 0;/*輸出效果:創(chuàng)建矩陣A: 請輸入矩陣的行數(shù),列數(shù),非零元素個數(shù):(逗號)3,3,3請按行序順序輸入第1個非零元素所在的行(13),列(13),元素值:(逗號)1,1,1請按行序順序輸入第2個非零元素所在的行(13),列(13),元素值:(逗號)1,3,2請按行序順序輸入第3個非零元素所在的行(13),列(13),元素值:(逗號)3,3,33行3列3個非零元素。 行 列 元素值 1 1 1 1 3 2 3 3 3由矩陣A復(fù)制矩陣B:3行3列3個非零元素。 行 列 元素值 1 1 1 1 3 2
19、 3 3 3銷毀矩陣B后:0行0列0個非零元素。 行 列 元素值重創(chuàng)矩陣B:(注意與矩陣A的行、列數(shù)相同,這樣方便后面的測試行、列分別為3,3)請輸入矩陣的行數(shù),列數(shù),非零元素個數(shù):(逗號)3,3,3請按行序順序輸入第1個非零元素所在的行(13),列(13),元素值:(逗號)1,2,1請按行序順序輸入第2個非零元素所在的行(13),列(13),元素值:(逗號)2,1,2請按行序順序輸入第3個非零元素所在的行(13),列(13),元素值:(逗號)3,1,33行3列3個非零元素。 行 列 元素值 1 2 1 2 1 2 3 1 3矩陣C1(A+B):3行3列6個非零元素。 行 列 元素值 1 1 1 1 2 1 1 3 2 2 1 2 3 1 3 3 3 3矩陣C2(A-B):3行3列6個非零元素。 行 列 元素值 1 1 1 1 2 -1 1 3 2 2 1 -2 3 1 -3 3 3 3矩陣C3(A的轉(zhuǎn)置):3行3列3個非
溫馨提示
- 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)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 七年級語文經(jīng)典誦讀計劃
- 部編版三年級語文下冊教學(xué)計劃課堂管理技巧
- 2025年互聯(lián)網(wǎng)數(shù)據(jù)中心數(shù)據(jù)中心數(shù)據(jù)中心能源管理初步設(shè)計評估報告
- 工業(yè)互聯(lián)網(wǎng)平臺2025年計算機視覺缺陷檢測技術(shù)在智能工廠產(chǎn)業(yè)競爭格局分析報告
- 2025年元宇宙社交平臺虛擬現(xiàn)實社交平臺用戶體驗評價體系構(gòu)建報告
- 2025年教育行業(yè)數(shù)字化教材開發(fā)與教育數(shù)據(jù)安全保護報告
- 2025年有色金屬行業(yè)資源循環(huán)利用產(chǎn)業(yè)鏈產(chǎn)業(yè)鏈標(biāo)準(zhǔn)化與質(zhì)量提升報告
- 2025年工業(yè)互聯(lián)網(wǎng)平臺霧計算協(xié)同機制與工業(yè)互聯(lián)網(wǎng)平臺性能優(yōu)化報告
- 2025年基層醫(yī)療衛(wèi)生機構(gòu)信息化建設(shè)中的醫(yī)療信息化服務(wù)創(chuàng)新趨勢報告
- 2025年開放銀行生態(tài)構(gòu)建中的金融科技與金融科技國際合作研究報告
- 代償協(xié)議樣本
- 《基于PLC的立式車床控制系統(tǒng)設(shè)計》13000字(論文)
- 保護耕地與糧食安全
- 新活素的臨床應(yīng)用
- 出口海運操作流程
- 2025年春季學(xué)期1530學(xué)生安全教育記錄表
- 電網(wǎng)數(shù)字化項目工作量度量規(guī)范應(yīng)用指南(2020版)
- 《宿舍樓安全評價》文檔版
- 信息系統(tǒng)安全審計合同模板
- 個人保證無糾紛承諾保證書
評論
0/150
提交評論