![稀疏矩陣應(yīng)用_第1頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/11/8d14df80-25bd-4dad-bd4f-4f3585084edb/8d14df80-25bd-4dad-bd4f-4f3585084edb1.gif)
![稀疏矩陣應(yīng)用_第2頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/11/8d14df80-25bd-4dad-bd4f-4f3585084edb/8d14df80-25bd-4dad-bd4f-4f3585084edb2.gif)
![稀疏矩陣應(yīng)用_第3頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/11/8d14df80-25bd-4dad-bd4f-4f3585084edb/8d14df80-25bd-4dad-bd4f-4f3585084edb3.gif)
![稀疏矩陣應(yīng)用_第4頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/11/8d14df80-25bd-4dad-bd4f-4f3585084edb/8d14df80-25bd-4dad-bd4f-4f3585084edb4.gif)
![稀疏矩陣應(yīng)用_第5頁](http://file3.renrendoc.com/fileroot_temp3/2021-12/11/8d14df80-25bd-4dad-bd4f-4f3585084edb/8d14df80-25bd-4dad-bd4f-4f3585084edb5.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、稀疏矩陣應(yīng)用課題簡介1.1課題及要求稀疏矩陣應(yīng)用(限1人完成)設(shè)計要求:實現(xiàn)三元組,十字鏈表下的稀疏矩陣的加、轉(zhuǎn)、乘的實現(xiàn)。(1) 稀疏矩陣的存儲(2) 稀疏矩陣加法(3) 矩陣乘法(4) 矩陣轉(zhuǎn)置1.2課程任務(wù)分析本課程設(shè)計主要實現(xiàn)在三元組存儲結(jié)構(gòu)與十字鏈表存儲結(jié)構(gòu)下輸入稀疏矩陣,并對稀疏矩陣進行轉(zhuǎn)置,相加,相乘操作,最后輸出運算后的結(jié)果。稀疏矩陣采用三元組和十字鏈表表示, 并在兩種不同的存儲結(jié)構(gòu)下, 求兩個具有相同行列數(shù)的稀疏矩陣 A和B的相加矩陣C,并輸出C;求 出A的轉(zhuǎn)置矩陣D,輸出D;求兩個稀疏矩陣A和B勺相乘矩陣E,并輸出E。1.3課程的意義其意義是讓我們在學習完 G數(shù)據(jù)結(jié)構(gòu)等課程
2、基礎(chǔ)上,掌握多維數(shù)組的邏輯結(jié)構(gòu)和存儲結(jié) 構(gòu)、掌握稀疏矩陣的壓縮存儲及轉(zhuǎn)置,相加,相乘等基本操作,并用不同的方法輸出結(jié)果,進 一步掌握設(shè)計、實現(xiàn)較大系統(tǒng)的完整過程,包括系統(tǒng)分析、編碼設(shè)計、系統(tǒng)集成、以及調(diào)試分 析,熟練掌握數(shù)據(jù)結(jié)構(gòu)的選擇、設(shè)計、實現(xiàn)以及操作方法,為進一步的應(yīng)用開發(fā)打好基礎(chǔ)。程序分析2.1設(shè)計函數(shù)建立稀疏矩陣及初始化值和輸出稀疏矩陣的值本模塊要求設(shè)計函數(shù)建立稀疏矩陣并初始化,包括在三元組結(jié)構(gòu)下和十字鏈表結(jié)構(gòu)下。首先要定義兩種不同的結(jié)構(gòu)體類型,在創(chuàng)建稀疏矩陣時,需要設(shè)計兩個不同的函數(shù)分別在三元組 和十字鏈表下創(chuàng)建稀疏矩陣,在輸入出現(xiàn)錯誤時,能夠?qū)﹀e誤進行判別處理,初始化稀疏矩陣 都為
3、空值,特別注意在十字鏈表下,對變量進行動態(tài)的地址分配。在設(shè)計輸出稀疏矩陣的值的 函數(shù)時,也要針對兩種不同的情況,分別編制函數(shù),才能準確的輸出稀疏矩陣。在對稀疏矩陣 進行初始化及輸出值時,均只輸出非零元素的值和它所在的所在行及所在列。2.2構(gòu)造函數(shù)進行稀疏矩陣的轉(zhuǎn)置并輸出結(jié)果本模塊要求設(shè)計函數(shù)進行稀疏矩陣的轉(zhuǎn)置并輸出轉(zhuǎn)置后的結(jié)果,由于對稀疏函數(shù)的轉(zhuǎn)置只對一個矩陣進行操作,所以實現(xiàn)起來難度不是很大,函數(shù)也比較容易編寫。在編寫函數(shù)時,要 先定義一個相應(yīng)的結(jié)構(gòu)體變量用于存放轉(zhuǎn)置后的矩陣,最后把此矩陣輸出。2.3構(gòu)造函數(shù)進行兩個稀疏矩陣相加及相乘并輸出最終的稀疏矩陣本模塊要求設(shè)計相加和相乘函數(shù)對兩個矩陣
4、進行運算,并輸出最終的稀疏矩陣,在進行運 算前,要對兩個矩陣進行檢查,看是不是相同類型的矩陣,因為兩個矩陣相加要求兩個矩陣一 定是同一類型的矩陣,定義相應(yīng)的矩陣類型用于存放兩個矩陣相加相乘后的結(jié)果矩陣,這個結(jié) 果矩陣的行數(shù)列數(shù)需要綜合多方面情況來確定。這四個函數(shù)也是整個程序的難點,需要靈活運 用數(shù)組及指針的特點。2.4退出系統(tǒng)本模塊要求設(shè)置選項能隨時結(jié)束程序的運行,本程序中采用exit (0)函數(shù)。程序以用戶和計算機的對話方式執(zhí)行,即在計算機終端上顯示提示信息”之后,由用戶在鍵盤上輸入演示程序中需要的相關(guān)信息及命令。概要設(shè)計3.1主界面設(shè)計為了實現(xiàn)在兩種存儲結(jié)構(gòu)下對稀疏矩陣的多種算法功能的管理
5、,首先設(shè)計一含有多個菜單 項的主控菜單子程序以鏈接系統(tǒng)的各項子功能,方便用戶交互式使用本系統(tǒng)。本系統(tǒng)主控菜單運行界面如圖 1所示。圖1主界面圖3.2存儲結(jié)構(gòu)設(shè)計本系統(tǒng)采用三元組結(jié)構(gòu)和十字鏈表結(jié)構(gòu)存儲稀疏矩陣的具體信息。其中:在三元組中,所 有元素的信息用數(shù)組表示,每個數(shù)組元素中包含有行下標(i),列下標(j)和對應(yīng)的數(shù)值(e),它們是整型數(shù)據(jù),全部的信息用在十字鏈表中,全部結(jié)點的信息用結(jié)構(gòu)體(TSMatrix )包含,包括用數(shù)組(Triple data MAXSIZE )和總共的行數(shù)(mu),列數(shù)(nu)以及非零元素的 個數(shù)(tu)。在十字鏈表下,頭結(jié)點為指針數(shù)組的十字鏈表存儲;每個結(jié)點里面包
6、含行下標(i),列下標(j)和對應(yīng)的數(shù)值(e),它們是整型數(shù)據(jù),還有兩個指針 (right)、(down),屬于OLNode結(jié) 構(gòu)體。全部的信息用結(jié)構(gòu)體 (crosslist)包含,包括指針數(shù)組(OLink* rhead和*chead)和總共的行 數(shù)(mu),列數(shù)(nu)以及非零元素的個數(shù)(tu)。三元組結(jié)構(gòu)體定義typedef struct(int i,j;int e;Triple;typedef struct(Triple dataMAXSIZE;int rposMAXSIZE + 1;int nu, mu,tu; TSMatrix ;十字鏈表結(jié)構(gòu)體定義:typedef struct OL
7、Nodeint i,j;int e;struct OLNode *right,*down;OLNode,*OLink;typedef struct int mu,nu,tu;OLink *rhead,*chead;CrossList;3.3系統(tǒng)功能設(shè)計本系統(tǒng)除了要完成分別在三元組存儲結(jié)構(gòu)以及在十字鏈表下實現(xiàn)稀疏矩陣的初始化功能外還設(shè)置了 4個子功能菜單。稀疏矩陣的建立及初始化在三元組存儲結(jié)構(gòu)下,由函數(shù)voidCreateSMatrix (TSMatrix &M)實現(xiàn), 在十字鏈表存儲結(jié)構(gòu)下, 由函數(shù)void CreateSMatix_OL (CrossList & M)依據(jù)讀入
8、的行數(shù)和列數(shù)以及非零元素的個數(shù),分別設(shè)定每個非 零元素的信息。4個子功能的設(shè)計描述如下。(1) 稀疏矩陣的轉(zhuǎn)置:此功能在三元組存儲結(jié)構(gòu)下,由函數(shù) void TransposeSMatrix(TSMatrix M,TSMatrix &T)實 現(xiàn),在十字鏈表存儲結(jié)構(gòu)下,由函數(shù) void TurnSMatrix_OL(CrossList &M)實現(xiàn)。當用戶選擇 該功能,系統(tǒng)提示用戶初始化一個矩陣,然后進行轉(zhuǎn)置,最終輸出結(jié)果。(2) 稀疏矩陣的加法:此功能在三元組存儲結(jié)構(gòu)下,由函數(shù) void AddTMatix(TSMatrix M,TSMatrix T,TSMatrix &S
9、)實現(xiàn),在十字鏈表存儲結(jié)構(gòu)下,由函數(shù) int SMatrix_ADD(CrossList *A,CrossList *B)實現(xiàn)。當用 戶選擇該功能,系統(tǒng)即提示用戶初始化要進行加法的兩個矩陣的信息。然后進行加法,最后輸 出結(jié)果。(3) 稀疏矩陣的乘法:此功能在三元組存儲結(jié)構(gòu)下,由函數(shù) int MultSMatrix(TSMatrix M, TSMatrix N, TSMatrix &Q)實現(xiàn)。在十字鏈表存儲結(jié)構(gòu)下,由函數(shù) int MultSMatrix_OL(CrossList M, CrossList N, CrossList&Q)實現(xiàn)。當用戶選擇該功能,系統(tǒng)提示輸入要進行相乘
10、的兩個矩陣的詳細信息。然后進行相 乘,最后得到結(jié)果。(4)退出:即退出稀疏矩陣的應(yīng)用系統(tǒng),由 exit(0)函數(shù)實現(xiàn)。當用戶選擇該功能,則退出該稀疏矩 陣的應(yīng)用系統(tǒng)。調(diào)試分析4.1系統(tǒng)運行主界面系統(tǒng)運行主界面如圖2所示:-13 -圖2主界面圖4.2各子功能測試運行結(jié)果(以三元組為例)(1) 稀疏矩陣的創(chuàng)建及初始化:在主菜單下,用戶輸入1回車,是用三元組創(chuàng)建稀疏矩陣,根據(jù)屏幕提示初始化一個稀疏矩陣,按enter鍵,運行結(jié)果如圖3所示。璧口非零元個裁 在歹!)星大八: 在歹!)辰太卜;j孳普IJ建稀疏矩陣,請選擇操作=青你選寸巡健稀疏 L用三元組倉 表=魂出程序檸列美小1262 343 1B經(jīng)選擇
11、三疏矩性和加 .日辭距住相乘 k:退出程序圖3三元組倉!j建并初始化矩陣(2) 稀疏矩陣的轉(zhuǎn)置:用三元組創(chuàng)建稀疏矩陣后,用戶輸入 1回車,便顯示該矩陣的轉(zhuǎn)置矩陣,運行結(jié)果如圖4所圖4三元組稀疏矩陣轉(zhuǎn)置結(jié)果示意圖(3) 稀疏矩陣的相加:用三元組創(chuàng)建并初始化一個稀疏矩陣后,輸入2回車,按屏幕提示輸入第二個同類型的稀疏矩陣,按enter鍵,運行結(jié)果如圖5所示。請選擇操作:-羞坐陣: 另WWU 入元元元的廠 叟入會丁 88112 3 312 3 12歹二主krTTTF74 9 數(shù)2 3 2 行1 2 3 的 矩大大大 疏魘及.列數(shù)和非零元個數(shù):圖5三元組稀疏矩陣相加結(jié)果示意圖(4) 稀疏矩陣的相乘:用
12、三元組創(chuàng)建并初始化一個稀疏矩陣后,輸入3回車,按屏幕提示輸入第二個同類型的稀疏矩陣,按enter鍵,運行結(jié)果如圖6所示。甬蘭弓主目上 , I 1 I 請選擇操作:行列序 E-ps_nE組創(chuàng)建稀疏矩陣, 專置M輒另一個稀疏矩陣:請輸入稀疏矩陣的行數(shù)、列數(shù)和非零元個教瞇2瑾羋雷買素坐橋( 尋后的矩陣為(只列出非蓼完素).行麹關(guān)小1 3352 3283 148意鍵繼續(xù)枷八陶驪枳阡t塞歹!)及大七、116 ,在歹!)及大U 23? 吞歹心及大小* 3 1?(5)退出:在主菜單下,用戶輸入圖8。圖6三元組稀疏矩陣相乘結(jié)果示意圖3回車,或者在下級菜單中輸入 4回車,退出程序。運行結(jié)果如圖7,圖7主菜單退出
13、程序圖圖8下級菜單退出程序圖總結(jié)由于本程序要求用兩種辦法對稀疏矩陣進行運算,特別是用十字鏈表這種形式來對稀疏矩 陣進行運算,是實現(xiàn)起來有很多困難,主要包括:1、書上這種方面的東西不多,資料少,可以參考的東西不是很多;2、用十字鏈表進行運算比較復(fù)雜,難度較大,需要對指針掌握較好;3、在書寫課程設(shè)計報告時,沒有具體的模板,感覺無從下手。針對上述困難,我通過網(wǎng)絡(luò),圖書館找資料,借鑒別人的以往的優(yōu)秀的課程設(shè)計報告,和 同學們一起討論,逐步地解決自己的問題。通過此次課程設(shè)計,使我對本學期學的數(shù)據(jù)結(jié)構(gòu)有了更深的了解,也使自己的所學更加 牢固,并能夠把更方面的知識綜合起來運用。附錄:程序源代碼#includ
14、e<stdio.h>#include<stdlib.h>#define MAXSIZE 100int num100;typedef struct OLNodeint i,j;int e;struct OLNode *right,*down;OLNode,*OLink;typedef struct int mu,nu,tu;OLink *rhead,*chead;CrossList;十字鏈表結(jié)構(gòu)體定義typedef structint i,j;int e;Triple;typedef structTriple dataMAXSIZE;int rposMAXSIZE + 1
15、;int nu,mu,tu;TSMatrix;三元組結(jié)構(gòu)體定義;int CreateSMatix_OL(CrossList &M)int i,j,e;OLink q;OLink p;printf("請輸入稀疏矩陣的行數(shù),列數(shù),非零元素的個數(shù):");矩陣行數(shù),列數(shù)下標均從開始;scanf("%d%d%d",&M.mu,&M.nu,&M.tu);M.rhead=(OLink *)malloc(M.mu+1)*sizeof(OLNode);/分配內(nèi)存空間M.chead=(OLink *)malloc(M.nu+1)*sizeof
16、(OLNode);/分配內(nèi)存空間for( i=1;i<=M.mu;i+)M.rheadi=NULL;/把矩陣每個元素置空值for( i=1;i<=M.nu;i+)M.cheadi=NULL;printf("請輸入稀疏矩陣,如果行為 0,則退出n");scanf("%d%d%d”,&i,&j,&e);while(i!=0)p=(OLink)malloc(sizeof(OLNode);p->i=i;p->j=j;p->e=e;if(M.rheadi=NULL|M.rheadi->j>j)p->ri
17、ght=M.rheadi;M.rheadi=p;elseq=M.rheadi;while(q->right&&q->right->j<j)q=q->right;p->right=q->right;q->right=p;if(M.cheadj=NULL|M.cheadj->i>i)p->down=M.cheadj;M.cheadj=p;elseq=M.cheadj;while(q->down&&q->down->i<i)q=q->down;p->down=q-&g
18、t;down;q->down=p;scanf("%d%d%d",&i,&j,&e);return 1;/創(chuàng)建十字鏈表void CreateSMatrix(TSMatrix &M)/米用三兀組順序表存儲表示,創(chuàng)建稀疏矩陣Mprintf("請輸入稀疏矩陣的行數(shù)、列數(shù)和非零元個數(shù):");scanf("%d%d%d",&M.mu,&M.nu,&M.tu);if(M.mu<=0)|(M.nu<=0)|(M.tu<=0)|(M.tu>M.mu*M.nu)判斷行值
19、、列值、元素個數(shù)是否合法printf("輸入有誤!");for(int i=1;i<=M.tu;i+)/輸入稀疏矩陣元素printf("請輸入元素坐標(所在行,所在列)及大?。?quot;);scanf("%d%d%d”,&M.datai.i,&M.datai.j,&M.datai.e);if(M.datai.i<=0)|(M.datai.j<=0)printf(-輸入錯誤,請重新輸入");scanf("%d%d%d",&M.datai.i,&M.datai.j,&a
20、mp;M.datai.e);/if/for iint num100;if(M.tu)int i;for(i = 1; i <= M.mu; i+) numi = 0;/ 初始化for(int t = 1; t <= M.tu; t+) +numM.datat.i;/求M 中每一行含非零元素個數(shù)/ 求 rposM.rpos1 = 1;for(i = 2; i <= M.mu; i+) M.rposi = M.rposi-1 + numi-1;/創(chuàng)建三元組void TransposeSMatrix(TSMatrix M,TSMatrix &T)T.nu=M.mu;/T矩陣
21、存放轉(zhuǎn)置后的矩陣T.mu=M.nu;T.tu=M.tu;int q=1;for(int col=1;col<=M.nu;col+)/通過循環(huán),把非零元素的行數(shù)與列數(shù)進行交換,實現(xiàn)轉(zhuǎn)置for(int p=1;p<=M.tu;p+)if(M.datap.j=col)T.dataq.i=M.datap.j;T.dataq.j=M.datap.i;T.dataq.e=M.datap.e;q+;/三元組轉(zhuǎn)置int Compare(int a1,int b1,int a2,int b2)if(a1>a2)return 1;else if(a1<a2)return -1;else i
22、f(b1>b2)return 1;if(b1<b2)return -1;else return 0;void AddTMatix(TSMatrix M,TSMatrix T,TSMatrix &S)/矩陣 S 存放相加后的矩陣S.mu=M.mu>T.mu?M.mu:T.mu;/ 對S矩陣的行數(shù)賦值S.nu=M.nu>T.nu?M.nu:T.nu;/ 對S矩陣的列數(shù)賦值S.tu=0;int ce;int q=1;int mcount=1,tcount=1;while(mcount<=M.tu&&tcount<=T.tu)switch(C
23、ompare(M.datamcount.i,M.datamcount.j,T.datatcount.i,T.datatcount.j)/用switch分支語句,用compare函數(shù)對需要相加的兩個矩陣的某元素行數(shù)列數(shù)進行比較case -1: S.dataq.e=M.datamcount.e;/ 當 M.datamcount.i<T.datatcount.i 或 M.datamcount.j<T.datatcount.jS.dataq.i=M.datamcount.i;S.dataq.j=M.datamcount.j;/把第一個矩陣的行數(shù)i,列數(shù)j賦值給S矩陣的行數(shù)i,列數(shù)j q+;
24、mcount+;break;case 1: S.dataq.e=T.datatcount.e;/ 當 M.datamcount.i>T.datatcount.i 或M.datamcount.j>T.datatcount.jS.dataq.i=T.datatcount.i;S.dataq.j=T.datatcount.j;/把第二個矩陣的行數(shù)i,列數(shù)j賦值給S矩陣的行數(shù)i,列數(shù)jq+;tcount+;break;case 0: ce=M.datamcount.e+T.datatcount.e;/ 其他情況下把兩個矩陣的值相加if(ce) S.dataq.e=ce;S.dataq.i=
25、M.datamcount.i;S.dataq.j=M.datamcount.j;q+;mcount+;tcount+;else mcount+;tcount+;break;while(mcount<=M.tu)(S.dataq.e=M.datamcount.e;S.dataq.i=M.datamcount.i;S.dataq.j=M.datamcount.j;q+;mcount+; /在case=-1的情況下對S矩陣的非零值,行數(shù),列數(shù)進行賦值while(tcount<=M.tu)(S.dataq.e=T.datatcount.e;S.dataq.i=T.datatcount.i;
26、S.dataq.j=T.datatcount.j;q+;tcount+;/在case=1的情況下對S矩陣的非零值,行數(shù),列數(shù)進行賦值S.tu=q-1;/三元組相加int MultSMatrix(TSMatrix M, TSMatrix N, TSMatrix &Q)( int arow, brow, ccol, i, t, ctemp100, p, q, tp;/ 定義相乘函數(shù)中所需要用到的變量if(M.nu != N.mu) return 0;/如果第一個矩陣的行數(shù)不等于第二個矩陣的列數(shù),則退出Q.mu = M.mu, Q.nu = N.nu, Q.tu = 0;/三元組結(jié)構(gòu)類型 Q
27、存放相乘后的結(jié)果if(M.tu * N.tu != 0)/如果兩個矩陣元素相乘不為零,則進行運算for(arow = 1; arow <= M.mu; +arow)/最外側(cè)循環(huán)以矩陣行數(shù)作為循環(huán)變量( for(i = 0; i <= N.nu; +i) ctempi = 0;Q.rposarow = Q.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.m
28、u) 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 <= Q.nu; +ccol) /把運算后的結(jié)果存放到 Q中 if(ctempccol)if(+(Q.tu) > MAXSIZE) return 1;Q.dataQ.tu.i = arow, Q.dataQ.tu.j = ccol, Q.dataQ.tu.e = ctempccol;retur
29、n 1;/三元組相乘void ShowTMatrix(TSMatrix M)for(int col=1;col<=M.mu;col+)/通過雙重循環(huán),把稀疏矩陣中不為零的元素的行數(shù)、列數(shù)和值顯不'出來for(int p=1;p<=M.tu;p+)if(M.datap.i=col)printf("%4d %4d %4dn”,M.datap.i,M.datap.j,M.datap.e);/三元組顯示void TurnSMatrix_OL(CrossList &M)int col,row;/定義循環(huán)變量OLink p,q;/定義OLink結(jié)構(gòu)類型變量for(co
30、l=1;col<=M.mu;col+) /通過循環(huán),把非零元素的行數(shù)與列數(shù)進行交換,實現(xiàn)轉(zhuǎn)置 q=p=M.rheadcol;while(q)row=p->i;p->i=p->j;p->j=row;q=p->right;p->right=p->down;p->down=q;/十字鏈表轉(zhuǎn)置int SMatrix_ADD(CrossList *A,CrossList *B)OLNode *pa,*pb,*pre,*p,*cp100; / 定義 OLNode 類型的變量 int i,j,t; t=A->tu+B->tu;for(j=1;
31、j<=A->nu;j+)cpj=A->cheadj;/將 A 矩陣的列表頭指針賦給c政組for(i=1;i<=A->mu;i+)pa=A->rheadi;pb=B->rheadi;/將A, B矩陣的行表頭指針分別賦給pa, pbpre=NULL;while(pb)/當pb不等于零if(pa=NULL|pa->j>pb->j)p=(OLink)malloc(sizeof(OLNode);/ 給 p 動態(tài)分配空間 if(!pre)A->rheadi=p;else pre->right=p;p->right=pa;pre=
32、p;p->i=i;p->j=pb->j;p->e=pb->e;if(!A->cheadp->j)A->cheadp->j=cpp->j=p;p->down=NULL;/如果A->cheadp->j不等于零,則把p賦給它及cpp->jelsecpp->j->down=p;cpp->j=p;pb=pb->right;/否則把p賦給cpp->jelse if(pa->j<pb->j)pre=pa;pa=pa->right;else if(pa->e+pb-&
33、gt;e) t-;pa->e+=pb->e;pre=pa;pa=pa->right;pb=pb->right;else (t=t-2;if(!pre)A->rheadi=pa->right;else pre->right=pa->right;p=pa;pa=pa->right;if(A->cheadp->j=p)A->cheadp->j=cpp->j=p->down;else cpp->j->down=p->down;free(p);pb=pb->right;A->mu=A-
34、>mu>B->mu?A->mu:B->mu;A->nu=A->nu>B->nu?A->nu:B->nu;/A的行與列為 A及B當中較大的一個return 1;/十字鏈表相加int MultSMatrix_OL(CrossList M, CrossList N, CrossList &Q)(一int i, j, e;中間變量OLink p0, q0, p, pl, pla;中間變量if(M.nu != N.mu)/檢查稀疏矩陣M的列數(shù)和N的行數(shù)是否對應(yīng)相等(printf ("稀疏矩陣A的列數(shù)和B的行數(shù)不相等,不能
35、相乘。n");return 0;Q.mu = M.mu, Q.nu = N.nu, Q.tu = 0;if(!(Q.rhead = (OLink *)malloc(Q.mu + 1) * sizeof(OLink) exit(-2);if(!(Q.chead = (OLink *)malloc(Q.nu + 1) * sizeof(OLink) exit(-2);for(i = 1; i <= Q.mu; i+) Q.rheadi = NULL;for(i = 1; i <= Q.nu; i+) Q.cheadi = NULL;/相乘for(i =1; i <= Q
36、.mu; i+)for(j = 1; j <= Q.nu; j+)(p0 = M.rheadi, q0 = N.cheadj, e = 0;while(p0&&q0)/M第i行和N第j列有元素(if( p0->j > q0->i) q0 = q0->down; /M的列大于N的行,則N的列指針后移 else if(p0->j < q0->i) p0 = p0->right;/M的列小于N的行,則M的行指針右移else (/M的行等于N的列e += p0->e * q0->e;乘積累加q0 = q0->dow
37、n, p0 = p0->right;移動指針 if(e)乘積不為(if(!(p = (OLink)malloc(sizeof(OLNode) exit(-2);Q.tu+;/非零元素增加p->i = i, p->j = j, p->e = e, p->right = NULL, p->down = NULL;/ 賦值,指針后移 將p®入十字鏈表,行插入if(Q.rheadi = NULL)若p為該行的第個結(jié)點Q.rheadi = pl = p;/p插在該行的表頭且pl指向p(該行的最后一個結(jié)點)else pl->right = p, pl =
38、 p;插在pl所指結(jié)點之后,pl右移列插入if(Q.cheadj = NULL)/若p為該列的第一個結(jié)點Q.cheadj = p;該列的表頭指向pelse 插在列表尾pla = Q.cheadj;/pla指向j行的第個結(jié)點 while(pla->down) pla = pla->down;/pla 指向 j 行最后一個結(jié)點 pla->down = p; return 1;/十字鏈表相乘 int ShowMAtrix(CrossList *A)int col;OLink p;for(col=1;col<=A->mu;col+)if(A->rheadcol)p=
39、A->rheadcol;while(p)printf("%3d%3d%3dn”,p->i,p->j,p->e);p=p->right;return 1;/十字鏈表顯示void main()int n,i;TSMatrix M,T,S;CrossList MM,TT,SS;printf(" *稀疏矩陣應(yīng)用*");printf("n請你選擇創(chuàng)建稀疏矩陣的方法:n1 :用三元組創(chuàng)建稀疏矩陣n2:用十字鏈表創(chuàng)建稀疏矩 陣n3:退出程序");printf("n");scanf("%d",&
溫馨提示
- 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)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 人教版一年級語文下冊《猜燈謎》教學設(shè)計
- 2024-2025學年廣東省東莞市鳳崗鎮(zhèn)四年級(上)期末數(shù)學試卷
- 《幼兒衛(wèi)生學》復(fù)習提要
- 2025年中、大功率激光器合作協(xié)議書
- 非計劃拔管不良事件應(yīng)急處理考核試題
- 2025年中班幼兒園教師個人工作總結(jié)范文(二篇)
- 2025年九年級語文中考教學工作總結(jié)范文(二篇)
- 2025年九年級語文教學工作總結(jié)范文(二篇)
- 2025年五金交電購銷合同樣本(2篇)
- 2025年互相擔保合同模板(三篇)
- 長江委水文局2025年校園招聘17人歷年高頻重點提升(共500題)附帶答案詳解
- 2025年湖南韶山干部學院公開招聘15人歷年高頻重點提升(共500題)附帶答案詳解
- 廣東省廣州市番禺區(qū)2023-2024學年七年級上學期期末數(shù)學試題
- 智研咨詢發(fā)布:2024年中國MVR蒸汽機械行業(yè)市場全景調(diào)查及投資前景預(yù)測報告
- IF鋼物理冶金原理與關(guān)鍵工藝技術(shù)1
- JGJ46-2024 建筑與市政工程施工現(xiàn)場臨時用電安全技術(shù)標準
- 煙花爆竹重大危險源辨識AQ 4131-2023知識培訓
- 銷售提成對賭協(xié)議書范本 3篇
- 企業(yè)動火作業(yè)安全管理制度范文
- 六年級語文老師家長會
- DRG丨DIP病案10項質(zhì)控指標解讀
評論
0/150
提交評論