版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 課程設(shè)計報告</b></p><p> 課程名稱 《數(shù)據(jù)結(jié)構(gòu)》 </p><p> 課題名稱 稀疏矩陣實(shí)現(xiàn)與應(yīng)用 </p><p> 專業(yè) 計算機(jī)科學(xué)與技術(shù) </p><p> 班級
2、</p><p> 學(xué)號</p><p> 姓名 </p><p> 聯(lián)系方式 </p><p> 指導(dǎo)教師</p><p> 20 11 年 12 月 25 日</p><p><b> 目
3、 錄</b></p><p> 1、數(shù)據(jù)結(jié)構(gòu)課程設(shè)計任務(wù)書1</p><p> 1.1、題目-------------------------------------------------------------------------------------------------1</p><p> 1.2、要求--------------
4、-----------------------------------------------------------------------------------1</p><p> 2、總體設(shè)計 -------------------------------------------------------------------------------------------------1</p&g
5、t;<p> 2.1、功能模塊設(shè)計--------------------------------------------------------------------------------------1</p><p> 2.2、所有功能模塊的流程圖-----------------------------------------------------------------------
6、---2</p><p> 3、詳細(xì)設(shè)計----------------------------------------------------------------------------------------------------3</p><p> 3.1、程序中所采用的數(shù)據(jù)結(jié)構(gòu)及存儲結(jié)構(gòu)的說明----------------------------------------
7、-----10</p><p> 3.2、算法的設(shè)計思想----------------------------------------------------------------------------------10</p><p> 3.3、稀疏矩陣各種運(yùn)算的性質(zhì)變換-------------------------------------------------------
8、---------10</p><p> 4、調(diào)試與測試:--------------------------------------------------------------------------------------------10</p><p> 4.1、調(diào)試方法與步驟: ------------------------------------------------
9、-----------------------------10</p><p> 4.2、測試結(jié)果的分析與討論:----------------------------------------------------------------------11</p><p> 5、時間復(fù)雜度的分析:---------------------------------------------
10、--------------------------------------12</p><p> 6、源程序清單和執(zhí)行結(jié)果--------------------------------------------------------------------------------12</p><p> 7、C程序設(shè)計總結(jié)-------------------------------
11、----------------------------------------------------------20</p><p> 8、致謝--------------------------------------------------------------------------------------------------------20</p><p> 9、參考
12、文獻(xiàn)--------------------------------------------------------------------------------------------------20</p><p> 1、數(shù)據(jù)結(jié)構(gòu)課程設(shè)計任務(wù)書</p><p><b> 1.1、題目</b></p><p> 實(shí)現(xiàn)三元組,十字鏈表下
13、的稀疏矩陣的加、轉(zhuǎn)、乘的實(shí)現(xiàn)。</p><p><b> 1.2、要求</b></p><p> (1).設(shè)計函數(shù)建立稀疏矩陣,初始化值;</p><p> (2).設(shè)計函數(shù)輸出稀疏矩陣的值;</p><p> (3).構(gòu)造函數(shù)進(jìn)行兩個稀疏矩陣相加,輸出最終的稀疏矩陣;</p><p>
14、 (4).構(gòu)造函數(shù)進(jìn)行兩個稀疏矩陣相減,輸出最終的稀疏矩陣;</p><p> (5).構(gòu)造函數(shù)進(jìn)行稀疏矩陣的轉(zhuǎn)置,并輸出結(jié)果;</p><p><b> (6).退出系統(tǒng)。</b></p><p><b> 2、總體設(shè)計</b></p><p> 2.1、功能模塊設(shè)計</p>
15、<p> 2.2、所有功能模塊的流程圖</p><p><b> 3、詳細(xì)設(shè)計</b></p><p> 1. 定義程序中所有用到的數(shù)據(jù)及其數(shù)據(jù)結(jié)構(gòu),及其基本操作的實(shí)現(xiàn);</p><p> typedef struct {</p><p><b> int i, j;</b>&
16、lt;/p><p><b> int e;</b></p><p> } Triple; // 定義三元組的元素</p><p> typedef struct {</p><p> Triple data[MAXSIZE + 1];</p><p> int mu, nu, tu;<
17、/p><p> } TSMatrix; // 定義普通三元組對象</p><p> typedef struct {</p><p> Triple data[MAXSIZE + 2];</p><p> int rpos[MAXROW + 1];</p><p> int mu, nu, tu;</p&g
18、t;<p> } RLSMatrix; // 定義帶鏈接信息的三元組對象</p><p> typedef struct OLNode { // 定義十字鏈表元素</p><p><b> int i, j;</b></p><p><b> int e;</b></p><p&g
19、t; struct OLNode *right, *down; // 該非零元所在行表和列表的后繼元素</p><p> } OLNode, *OLink; // 定義十字鏈表元素</p><p> typedef struct { // 定義十字鏈表對象結(jié)構(gòu)體</p><p> OLink *rhead, *chead;</p><
20、;p> int mu, nu, tu; // 系數(shù)矩陣的行數(shù),列數(shù),和非零元素個數(shù)</p><p> } CrossList; // 定義十字鏈表對象結(jié)構(gòu)體</p><p><b> 2.主函數(shù)</b></p><p> int main()</p><p><b> {</b&
21、gt;</p><p><b> int t;</b></p><p> cout.fill('*');</p><p> cout << setw(80) << '*';</p><p> cout.fill(' ');</p>
22、<p> cout << setw(50) << "***歡迎使用矩陣運(yùn)算程序***" << endl; //輸出頭菜單</p><p> cout.fill('*');</p><p> cout << setw(80) << '*';</p>
23、<p> cout.fill(' ');</p><p> cout << " 請選擇要進(jìn)行的操作:" << endl;</p><p> cout << " 1:矩陣的轉(zhuǎn)置。" <&
24、lt; endl;</p><p> cout << " 2:矩陣的加法。" << endl;</p><p> cout << " 3:矩陣的乘法。" << endl;</p><p&g
25、t; cout << " 4:退出程序。" << endl;</p><p><b> while(t)</b></p><p><b> {</b></p><p> cout<<"請輸入您要進(jìn)行的操作
26、:"<<endl;</p><p><b> cin>>t;</b></p><p><b> switch(t)</b></p><p><b> {</b></p><p><b> case 1:</b>&l
27、t;/p><p> TransposeSMatrix(); //調(diào)用矩陣轉(zhuǎn)置函數(shù)</p><p><b> break;</b></p><p><b> case 2:</b></p><p> AddSMatrix(); //調(diào)用矩陣相加函數(shù)</p><p><
28、b> break;</b></p><p><b> case 3: </b></p><p> MultSMatrix(); //調(diào)用矩陣相乘函數(shù)</p><p><b> break;</b></p><p><b> case 4:</b>&l
29、t;/p><p><b> t=0;</b></p><p><b> break;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> return 0;&
30、lt;/b></p><p><b> }</b></p><p><b> 矩陣的轉(zhuǎn)置函數(shù)</b></p><p> bool TransposeSMatrix() // 求矩陣的轉(zhuǎn)置矩陣</p><p><b> {</b></p><p&
31、gt; TSMatrix M, T; //定義預(yù)轉(zhuǎn)置的矩陣</p><p> InPutTSMatrix(M, 0); //輸入矩陣</p><p> int num[MAXROW + 1];</p><p> int cpot[MAXROW + 1]; // 構(gòu)建輔助數(shù)組</p><p> int q, p, t;</p
32、><p> T.tu = M.tu;</p><p> T.mu = M.nu;</p><p> T.nu = M.mu;</p><p> if (T.tu) </p><p><b> {</b></p><p> for (int col = 1; col
33、<= M.nu; col++) num[col] = 0;</p><p> for (t = 1; t <= M.tu; t++) ++num[M.data[t].j];</p><p> cpot[1] = 1;</p><p> for (int i = 2; i <= M.nu; i++) cpot[i] = cpot[i - 1]
34、+ num[i - 1]; // 求出每一列中非零元素在三元組中出現(xiàn)的位置</p><p> for (p = 1; p <= M.tu; p++) </p><p><b> {</b></p><p> int col = M.data[p].j;</p><p> q = cpot[col];&l
35、t;/p><p> T.data[q].i = M.data[p].j;</p><p> T.data[q].j = M.data[p].i;</p><p> T.data[q].e = M.data[p].e;</p><p> ++cpot[col];</p><p><b> }</b&
36、gt;</p><p><b> }</b></p><p> cout << "輸入矩陣的轉(zhuǎn)置矩陣為" << endl;</p><p> OutPutSMatrix(T);</p><p> return true;</p><p><
37、b> }</b></p><p> bool Count(RLSMatrix &T) {</p><p> int num[MAXROW + 1];</p><p> for (int row = 1; row <= T.mu; row++) num[row] = 0;</p><p> for (i
38、nt col = 1; col <= T.tu; col++) ++num[T.data[col].i];</p><p> T.rpos[1] = 1;</p><p> for (int i = 2; i <= T.mu; i++) T.rpos[i] = T.rpos[i - 1] + num[i - 1]; // 求取每一行中非零元素在三元組中出現(xiàn)的位置</p
39、><p> return true;</p><p><b> }</b></p><p><b> 矩陣的乘法函數(shù)</b></p><p> bool MultSMatrix() // 兩個矩陣相乘</p><p><b> {</b></
40、p><p> RLSMatrix M, N, Q; // 構(gòu)建三個帶“鏈接信息”的三元組表示的數(shù)組</p><p> InPutTSMatrix(M, 1); // 用普通三元組形式輸入數(shù)組</p><p> InPutTSMatrix(N, 1);</p><p><b> Count(M);</b></p
41、><p><b> Count(N);</b></p><p> cout << "輸入的兩矩陣的乘矩陣為:" << endl;</p><p> if (M.nu != N.mu) return false;</p><p> Q.mu = M.mu;</p>
42、<p> Q.nu = N.nu;</p><p> Q.tu = 0; // Q初始化</p><p> int ctemp[MAXROW + 1]; // 輔助數(shù)組</p><p> int arow, tp, p, brow, t, q, ccol;</p><p> if (M.tu * N.tu
43、) // Q是非零矩陣</p><p><b> {</b></p><p> for (arow = 1; arow <= M.mu; arow++) </p><p><b> {</b></p><p> ///memset(ctemp,0,N.nu);</p>
44、<p> for (int x = 1; x <= N.nu; x++) // 當(dāng)前行各元素累加器清零</p><p> ctemp[x] = 0;</p><p> Q.rpos[arow] = Q.tu + 1; // 當(dāng)前行的首個非零元素在三元組中的位置為此行前所有非零元素+1</p><p> if (arow < M.mu)
45、 tp = M.rpos[arow + 1];</p><p> else tp = M.tu + 1;</p><p> for (p = M.rpos[arow]; p < tp; p++) // 對當(dāng)前行每個非零元素進(jìn)行操作</p><p><b> { </b></p><p> brow =
46、M.data[p].j; // 在N中找到i值也操作元素的j值相等的行</p><p> if (brow < N.mu) t = N.rpos[brow + 1];</p><p> else t = N.tu + 1;</p><p> for (q = N.rpos[brow]; q < t; q++) // 對找出的行當(dāng)每個非零元素進(jìn)行
47、操作</p><p><b> { </b></p><p> ccol = N.data[q].j;</p><p> ctemp[ccol] += M.data[p].e * N.data[q].e; // 將乘得到對應(yīng)值放在相應(yīng)的元素累加器里面</p><p><b> }</b>
48、;</p><p><b> }</b></p><p> for (ccol = 1; ccol <= Q.nu; ccol++) // 對已經(jīng)求出的累加器中的值壓縮到Q中</p><p> if (ctemp[ccol]) </p><p><b> {</b></p&g
49、t;<p> if (++Q.tu > MAXSIZE) return false;</p><p> Q.data[Q.tu].e = ctemp[ccol];</p><p> Q.data[Q.tu].i = arow;</p><p> Q.data[Q.tu].j = ccol;</p><p><
50、b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> OutPutSMatrix(Q);</p><p> return true;</p><p><b> }</b&g
51、t;</p><p><b> 矩陣的加法函數(shù)</b></p><p> bool AddSMatrix() //矩陣的加法</p><p><b> {</b></p><p> CrossList M, N; // 創(chuàng)建兩個十字鏈表對象,并初始化</p><p>
52、; CreateSMatrix_OL(M);</p><p> CreateSMatrix_OL(N);</p><p> cout << "輸入的兩矩陣的和矩陣為:" << endl;</p><p> OLink pa, pb, pre, hl[MAXROW + 1]; //定義輔助指針,pa,pb分別為M,N
53、當(dāng)前比較的元素,pre為pa的前驅(qū)元素</p><p> for (int x = 1; x <= M.nu; x++) hl[x] = M.chead[x];</p><p> for (int k = 1; k <= M.mu; k++) // 對M的每一行進(jìn)行操作</p><p><b> { </b></p>
54、;<p> pa = M.rhead[k];</p><p> pb = N.rhead[k];</p><p> pre = NULL;</p><p> while (pb) // 把N中此行的每個元素取出</p><p><b> { </b></p><p><
55、;b> OLink p;</b></p><p> if (!(p = (OLink) malloc(sizeof (OLNode)))) exit(0); // 開辟新節(jié)點(diǎn),存儲N中取出的元素</p><p> p->e = pb->e;</p><p> p->i = pb->i;</p><
56、;p> p->j = pb->j;</p><p> if (NULL == pa || pa->j > pb->j) // 當(dāng)M此行已經(jīng)檢查完或者pb因該放在pa前面</p><p><b> { </b></p><p> if (NULL == pre)</p><p>
57、; M.rhead[p->i] = p;</p><p><b> else</b></p><p> pre->right = p;</p><p> p->right = pa;</p><p><b> pre = p;</b></p><p&g
58、t; if (NULL == M.chead[p->j]) // 進(jìn)行列插入</p><p><b> {</b></p><p> M.chead[p->j] = p;</p><p> p->down = NULL;</p><p><b> } </b></
59、p><p><b> else </b></p><p><b> {</b></p><p> p->down = hl[p->j]->down;</p><p> hl[p->j]->down = p;</p><p><b>
60、 }</b></p><p> hl[p->j] = p;</p><p> pb = pb->right;</p><p><b> } </b></p><p><b> else</b></p><p> if ((NULL != p
61、a) && pa->j < pb->j) // 如果此時的pb元素因該放在pa后面,則取以后的pa再來比較</p><p><b> { </b></p><p><b> pre = pa;</b></p><p> pa = pa->right;</p>&
62、lt;p><b> } </b></p><p><b> else</b></p><p> if (pa->j == pb->j) // 如果pa,pb位于同一個位置上,則將值相加</p><p><b> { </b></p><p> pa-
63、>e += pb->e;</p><p> if (!pa->e) </p><p> { // 如果相加后的和為0,則刪除此節(jié)點(diǎn),同時改變此元素坐在行,列的前驅(qū)元素的相應(yīng)值</p><p> if (NULL == pre) // 修改行前驅(qū)元素值</p><p> M.rhead[pa->i] = pa-&
64、gt;right;</p><p><b> else</b></p><p> pre->right = pa->right;</p><p><b> p = pa;</b></p><p> pa = pa->right;</p><p>
65、if (M.chead[p->j] == p) M.chead[p->j] = hl[p->j] = p->down; // 修改列前驅(qū)元素值</p><p><b> else</b></p><p> hl[p->j]->down = p->down;</p><p><b> fr
66、ee(p);</b></p><p> pb = pb->right;</p><p><b> } </b></p><p><b> else </b></p><p><b> {</b></p><p> pa = p
67、a->right;</p><p> pb = pb->right;</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</
68、b></p><p> OutPutSMatrix_OL(M);</p><p> return true;</p><p><b> }</b></p><p><b> 創(chuàng)建十字鏈表</b></p><p> bool CreateSMatrix_OL(C
69、rossList & M)// 創(chuàng)建十字鏈表</p><p><b> {</b></p><p> int x, y, m;</p><p> cout << "請輸入矩陣的行,列,及非零元素個數(shù)" << endl;</p><p> cin >&g
70、t; M.mu >> M.nu >> M.tu;</p><p> if (!(M.rhead = (OLink*) malloc((M.mu + 1) * sizeof (OLink)))) exit(0);</p><p> if (!(M.chead = (OLink*) malloc((M.nu + 1) * sizeof (OLink)))) exit
71、(0);</p><p> for (x = 0; x <= M.mu; x++)</p><p> M.rhead[x] = NULL; // 初始化各行,列頭指針,分別為NULL</p><p> for (x = 0; x <= M.nu; x++)</p><p> M.chead[x] = NULL;</p
72、><p> cout << "請按三元組的格式輸入數(shù)組:" << endl;</p><p> for (int i = 1; i <= M.tu; i++) </p><p><b> {</b></p><p> cin >> x >> y
73、 >> m; // 按任意順序輸入非零元,(普通三元組形式輸入)</p><p> OLink p, q;</p><p> if (!(p = (OLink) malloc(sizeof (OLNode)))) exit(0); // 開辟新節(jié)點(diǎn),用來存儲輸入的新元素</p><p><b> p->i = x;</b&g
74、t;</p><p><b> p->j = y;</b></p><p><b> p->e = m;</b></p><p> if (M.rhead[x] == NULL || M.rhead[x]->j > y) </p><p><b> {<
75、;/b></p><p> p->right = M.rhead[x];</p><p> M.rhead[x] = p;</p><p><b> } </b></p><p><b> else </b></p><p><b> {<
76、;/b></p><p> for (q = M.rhead[x]; (q->right) && (q->right->j < y); q = q->right); // 查找節(jié)點(diǎn)在行表中的插入位置</p><p> p->right = q->right;</p><p> q->ri
77、ght = p; // 完成行插入</p><p><b> }</b></p><p> if (M.chead[y] == NULL || M.chead[y]->i > x) </p><p><b> {</b></p><p> p->down = M.che
78、ad[y];</p><p> M.chead[y] = p;</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> for (q = M.chead[y];
79、(q->down) && (q->down->i < x); q = q->down); // 查找節(jié)點(diǎn)在列表中的插入位置</p><p> p->down = q->down;</p><p> q->down = p; // 完成列插入</p><p><b> }</b&g
80、t;</p><p><b> }</b></p><p> return true;</p><p><b> }</b></p><p><b> 十字鏈表的輸出</b></p><p> bool OutPutSMatrix_OL(Cro
81、ssList T)// 輸出十字鏈表,用普通數(shù)組形式輸出</p><p><b> { </b></p><p> for (int i = 1; i <= T.mu; i++) </p><p><b> {</b></p><p> OLink p = T.rhead[i];&l
82、t;/p><p> for (int j = 1; j <= T.nu; j++) </p><p><b> {</b></p><p> if ((p) && (j == p->j))</p><p><b> {</b></p><p>
83、 cout << setw(3) << p->e;</p><p> p = p->right;</p><p><b> } else</b></p><p> cout << setw(3) << "0";</p><p><
84、;b> }</b></p><p> cout << endl;</p><p><b> }</b></p><p> return true;</p><p><b> }</b></p><p> 3.1、程序中所采用的數(shù)據(jù)結(jié)構(gòu)
85、的說明</p><p> ADT SparseMatrix{ 數(shù)據(jù)對象:D={aij | i=1,2,…,m; j=1,2,..,n;</p><p> aij∈Elemset, m和n分別稱為矩陣的行數(shù)和列數(shù)。} 數(shù)據(jù)關(guān)系:R={Row,Col}
86、160; Row={<ai,j , ai,j+1> | 1<=i<=m, 1<=j<=n-1}</p><p> Col= {<ai,j , ai+1,j> | 1<=i<=m-1, 1<=j<=n}基本操作: CreateSMatr
87、ix(&M); 操作結(jié)果:創(chuàng)建稀疏矩陣M。 DestroySMatrix(&M); 初始條件:稀疏矩陣M存在。 操作結(jié)果:銷毀稀疏矩陣M。
88、160; PrintSMatrix(M); 初始條件:稀疏矩陣M存在。 操作結(jié)果:輸出稀疏矩陣M。 AddSMatrix(M,N,&Q); &
89、#160; 初始條件:稀疏矩陣M與N的行數(shù)和列數(shù)對應(yīng)相等 操作結(jié)果:求稀疏矩陣的和Q=M+N。 MultSMatrix(M,N,&Q); 初始條件:稀疏矩陣M的列數(shù)等于N的行數(shù)。 操作結(jié)果:求稀疏矩陣乘積Q=M*N。
90、160;TransposeSMatrix(M,&T); 初始條件:稀疏矩陣M存在。 操作結(jié)果:求稀疏矩陣M的轉(zhuǎn)置矩陣T。 }ADT SparseMatrix</p><p> 3.2、算法的設(shè)計思想</p><p> 本實(shí)驗(yàn)要求在三元組,十字鏈表下
91、實(shí)現(xiàn)稀疏 矩陣的加、轉(zhuǎn)、乘。首先要進(jìn)行矩陣的初始化操作,定義三元組和十字鏈表的元素對象。寫出轉(zhuǎn)置,加法,乘法的操作函數(shù)。通過主函數(shù)調(diào)用實(shí)現(xiàn)在一個程序下進(jìn)行矩陣的運(yùn)算操作。</p><p> 3.3、稀疏矩陣各種運(yùn)算的性質(zhì)變換</p><p><b> a)加法運(yùn)算</b></p><p> 兩個稀疏矩陣的加和矩陣仍然是稀疏矩陣</p
92、><p><b> b)乘法運(yùn)算</b></p><p> 兩個稀疏矩陣的乘積矩陣不是稀疏矩陣</p><p><b> c)轉(zhuǎn)置運(yùn)算</b></p><p> 一個稀疏矩陣的轉(zhuǎn)置矩陣仍然是稀疏矩陣</p><p><b> 4、調(diào)試與測試:</b>
93、;</p><p> 4.1、調(diào)試方法與步驟:</p><p> 實(shí)際完成的情況說明(完成的功能,支持的數(shù)據(jù)類型等);</p><p> 完成了稀疏矩陣的建立,初始化及輸出值的操作。</p><p> 實(shí)現(xiàn)三元組,十字鏈表下的稀疏矩陣的加法,乘法以及轉(zhuǎn)置運(yùn)算。</p><p> 2.程序的性能分析,包括時空分
94、析;</p><p> 能應(yīng)對一般小的錯誤輸入,如果復(fù)雜則自動退出程序。</p><p> 3.上機(jī)過程中出現(xiàn)的問題及其解決方案;</p><p> 1.起始有錯誤,設(shè)定的變量名相同。經(jīng)檢查,改正。</p><p> 2.一些邏輯錯誤。經(jīng)討論改正。運(yùn)行出現(xiàn)部分語法錯誤修正</p><p> 4.程序中可以改進(jìn)
95、的地方說明;</p><p> 程序在運(yùn)行中一旦出現(xiàn)矩陣數(shù)據(jù)格式錯誤如輸入漢字,則程序自動退出。需要重新啟動。更新程序?qū)Ω噱e誤輸入情況的分析能力。</p><p> 5.程序中可以擴(kuò)充的功能及設(shè)計實(shí)現(xiàn)假想。</p><p><b> 對退出操作的擴(kuò)充</b></p><p> 在主菜單下,用戶輸入4回車選擇退出
96、程序是,詢問是否真的退出系統(tǒng),如果是,則即退出系統(tǒng),否則顯示……continue……并且返回主菜單。為了方便由于誤按導(dǎo)致程序退出。</p><p> 在退出時可以增加一段感謝使用本程序的結(jié)束語。</p><p> 4.2、測試結(jié)果的分析與討論:</p><p><b> 系統(tǒng)運(yùn)行主界面</b></p><p>
97、輸入需要執(zhí)行的操作1矩陣的轉(zhuǎn)置</p><p> 輸入需要執(zhí)行的操作2矩陣的加法</p><p> 輸入需要執(zhí)行的操作3矩陣的乘法</p><p> 輸入錯誤操作時需要重新選擇</p><p><b> 退出操作</b></p><p> 5、時間復(fù)雜度的分析:</p>&
98、lt;p><b> a)加法運(yùn)算</b></p><p> 由于兩矩陣行列相等,故時間復(fù)雜度為O(行*列)</p><p><b> b)乘法運(yùn)算</b></p><p> 設(shè)M是m1*n1矩陣,N是m2*n2矩陣,則時間復(fù)雜度是O(m1*n1*n2)</p><p><b>
99、; c)轉(zhuǎn)置運(yùn)算</b></p><p> 時間復(fù)雜度和原矩陣的列數(shù)及非零元的個數(shù)的乘積成正比,即O(mu*nu)</p><p> 源程序清單和執(zhí)行結(jié)果</p><p> #include <iostream></p><p> #include <iomanip></p><
100、;p> using namespace std;</p><p> const int MAXSIZE = 100; // 定義非零元素的對多個數(shù)</p><p> const int MAXROW = 10; // 定義數(shù)組的行數(shù)的最大值</p><p> typedef struct {</p><p><b>
101、 int i, j;</b></p><p><b> int e;</b></p><p> } Triple; // 定義三元組的元素</p><p> typedef struct {</p><p> Triple data[MAXSIZE + 1];</p><p>
102、 int mu, nu, tu;</p><p> } TSMatrix; // 定義普通三元組對象</p><p> typedef struct {</p><p> Triple data[MAXSIZE + 2];</p><p> int rpos[MAXROW + 1];</p><p> in
103、t mu, nu, tu;</p><p> } RLSMatrix; // 定義帶鏈接信息的三元組對象</p><p> typedef struct OLNode { // 定義十字鏈表元素</p><p><b> int i, j;</b></p><p><b> int e;</b&g
104、t;</p><p> struct OLNode *right, *down; // 該非零元所在行表和列表的后繼元素</p><p> } OLNode, *OLink; // 定義十字鏈表元素</p><p> typedef struct { // 定義十字鏈表對象結(jié)構(gòu)體</p><p> OLink *rhead, *
105、chead;</p><p> int mu, nu, tu; // 系數(shù)矩陣的行數(shù),列數(shù),和非零元素個數(shù)</p><p> } CrossList; // 定義十字鏈表對象結(jié)構(gòu)體</p><p> template <class P></p><p> bool InPutTSMatrix(P & T,
106、int y) { //輸入矩陣,按三元組格式輸入</p><p> cout << "輸入矩陣的行,列和非零元素個數(shù):" << endl;</p><p> cin >> T.mu >> T.nu >> T.tu;</p><p> cout << "請輸出非
107、零元素的位置和值:" << endl;</p><p> for (int k = 1; k <= T.tu; k++)</p><p> cin >> T.data[k].i >> T.data[k].j >> T.data[k].e;</p><p> return true;</p&g
108、t;<p><b> }</b></p><p> template <class P></p><p> bool OutPutSMatrix(P T) {</p><p> int m, n, k = 1;</p><p> for (m = 0; m < T.mu; m++
109、) {</p><p> for (n = 0; n < T.nu; n++) {</p><p> if ((T.data[k].i - 1) == m && (T.data[k].j - 1) == n) {</p><p> cout.width(4);</p><p> cout << T.d
110、ata[k++].e;</p><p><b> } else {</b></p><p> cout.width(4);</p><p> cout << "0";</p><p><b> }</b></p><p><b&g
111、t; }</b></p><p> cout << endl;</p><p><b> }</b></p><p> return true;</p><p> }// 輸出矩陣,按標(biāo)準(zhǔn)格式輸出</p><p> bool TransposeSMatrix()
112、 // 求矩陣的轉(zhuǎn)置矩陣</p><p><b> {</b></p><p> TSMatrix M, T; //定義預(yù)轉(zhuǎn)置的矩陣</p><p> InPutTSMatrix(M, 0); //輸入矩陣</p><p> int num[MAXROW + 1];</p><p> i
113、nt cpot[MAXROW + 1]; // 構(gòu)建輔助數(shù)組</p><p> int q, p, t;</p><p> T.tu = M.tu;</p><p> T.mu = M.nu;</p><p> T.nu = M.mu;</p><p> if (T.tu) </p><
114、;p><b> {</b></p><p> for (int col = 1; col <= M.nu; col++) num[col] = 0;</p><p> for (t = 1; t <= M.tu; t++) ++num[M.data[t].j];</p><p> cpot[1] = 1;</p&
115、gt;<p> for (int i = 2; i <= M.nu; i++) cpot[i] = cpot[i - 1] + num[i - 1]; // 求出每一列中非零元素在三元組中出現(xiàn)的位置</p><p> for (p = 1; p <= M.tu; p++) </p><p><b> {</b></p>
116、<p> int col = M.data[p].j;</p><p> q = cpot[col];</p><p> T.data[q].i = M.data[p].j;</p><p> T.data[q].j = M.data[p].i;</p><p> T.data[q].e = M.data[p].e;&l
117、t;/p><p> ++cpot[col];</p><p><b> }</b></p><p><b> }</b></p><p> cout << "輸入矩陣的轉(zhuǎn)置矩陣為" << endl;</p><p> OutP
118、utSMatrix(T);</p><p> return true;</p><p><b> }</b></p><p> bool Count(RLSMatrix &T) {</p><p> int num[MAXROW + 1];</p><p> for (int r
119、ow = 1; row <= T.mu; row++) num[row] = 0;</p><p> for (int col = 1; col <= T.tu; col++) ++num[T.data[col].i];</p><p> T.rpos[1] = 1;</p><p> for (int i = 2; i <= T.mu; i
120、++) T.rpos[i] = T.rpos[i - 1] + num[i - 1]; // 求取每一行中非零元素在三元組中出現(xiàn)的位置</p><p> return true;</p><p><b> }</b></p><p> bool MultSMatrix() // 兩個矩陣相乘</p><p><
121、;b> {</b></p><p> RLSMatrix M, N, Q; // 構(gòu)建三個帶“鏈接信息”的三元組表示的數(shù)組</p><p> InPutTSMatrix(M, 1); // 用普通三元組形式輸入數(shù)組</p><p> InPutTSMatrix(N, 1);</p><p><b> C
122、ount(M);</b></p><p><b> Count(N);</b></p><p> cout << "輸入的兩矩陣的乘矩陣為:" << endl;</p><p> if (M.nu != N.mu) return false;</p><p>
123、 Q.mu = M.mu;</p><p> Q.nu = N.nu;</p><p> Q.tu = 0; // Q初始化</p><p> int ctemp[MAXROW + 1]; // 輔助數(shù)組</p><p> int arow, tp, p, brow, t, q, ccol;</p>&l
124、t;p> if (M.tu * N.tu) // Q是非零矩陣</p><p><b> {</b></p><p> for (arow = 1; arow <= M.mu; arow++) </p><p><b> {</b></p><p> ///memset(ct
125、emp,0,N.nu);</p><p> for (int x = 1; x <= N.nu; x++) // 當(dāng)前行各元素累加器清零</p><p> ctemp[x] = 0;</p><p> Q.rpos[arow] = Q.tu + 1; // 當(dāng)前行的首個非零元素在三元組中的位置為此行前所有非零元素+1</p><p&
126、gt; if (arow < M.mu) tp = M.rpos[arow + 1];</p><p> else tp = M.tu + 1;</p><p> for (p = M.rpos[arow]; p < tp; p++) // 對當(dāng)前行每個非零元素進(jìn)行操作</p><p><b> { </b></p
127、><p> brow = M.data[p].j; // 在N中找到i值也操作元素的j值相等的行</p><p> if (brow < N.mu) t = N.rpos[brow + 1];</p><p> else t = N.tu + 1;</p><p> for (q = N.rpos[brow]; q < t;
128、 q++) // 對找出的行當(dāng)每個非零元素進(jìn)行操作</p><p><b> { </b></p><p> ccol = N.data[q].j;</p><p> ctemp[ccol] += M.data[p].e * N.data[q].e; // 將乘得到對應(yīng)值放在相應(yīng)的元素累加器里面</p><p&
129、gt;<b> }</b></p><p><b> }</b></p><p> for (ccol = 1; ccol <= Q.nu; ccol++) // 對已經(jīng)求出的累加器中的值壓縮到Q中</p><p> if (ctemp[ccol]) </p><p><b&
130、gt; {</b></p><p> if (++Q.tu > MAXSIZE) return false;</p><p> Q.data[Q.tu].e = ctemp[ccol];</p><p> Q.data[Q.tu].i = arow;</p><p> Q.data[Q.tu].j = ccol;&
131、lt;/p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> OutPutSMatrix(Q);</p><p> return true;</p><p
132、><b> }</b></p><p> bool CreateSMatrix_OL(CrossList & M)// 創(chuàng)建十字鏈表</p><p><b> {</b></p><p> int x, y, m;</p><p> cout << "
133、;請輸入矩陣的行,列,及非零元素個數(shù)" << endl;</p><p> cin >> M.mu >> M.nu >> M.tu;</p><p> if (!(M.rhead = (OLink*) malloc((M.mu + 1) * sizeof (OLink)))) exit(0);</p><p&
134、gt; if (!(M.chead = (OLink*) malloc((M.nu + 1) * sizeof (OLink)))) exit(0);</p><p> for (x = 0; x <= M.mu; x++)</p><p> M.rhead[x] = NULL; // 初始化各行,列頭指針,分別為NULL</p><p> for (
135、x = 0; x <= M.nu; x++)</p><p> M.chead[x] = NULL;</p><p> cout << "請按三元組的格式輸入數(shù)組:" << endl;</p><p> for (int i = 1; i <= M.tu; i++) </p><p&g
136、t;<b> {</b></p><p> cin >> x >> y >> m; // 按任意順序輸入非零元,(普通三元組形式輸入)</p><p> OLink p, q;</p><p> if (!(p = (OLink) malloc(sizeof (OLNode)))) exit(0);
137、 // 開辟新節(jié)點(diǎn),用來存儲輸入的新元素</p><p><b> p->i = x;</b></p><p><b> p->j = y;</b></p><p><b> p->e = m;</b></p><p> if (M.rhead[x]
138、== NULL || M.rhead[x]->j > y) </p><p><b> {</b></p><p> p->right = M.rhead[x];</p><p> M.rhead[x] = p;</p><p><b> } </b></p>
139、<p><b> else </b></p><p><b> {</b></p><p> for (q = M.rhead[x]; (q->right) && (q->right->j < y); q = q->right); // 查找節(jié)點(diǎn)在行表中的插入位置</p&g
溫馨提示
- 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. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 數(shù)據(jù)結(jié)構(gòu)與課程設(shè)計---稀疏矩陣
- 數(shù)據(jù)結(jié)構(gòu)--稀疏矩陣課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計---稀疏矩陣
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-- 稀疏矩陣的運(yùn)算
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--稀疏矩陣的操作
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--稀疏矩陣運(yùn)算器
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計論文----稀疏矩陣的轉(zhuǎn)置
- 《數(shù)據(jù)結(jié)構(gòu)》課程設(shè)計報告--稀疏矩陣運(yùn)算器
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告--稀疏矩陣運(yùn)算器
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告 稀疏矩陣運(yùn)算器
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告 稀疏矩陣運(yùn)算器設(shè)計
- 稀疏矩陣的轉(zhuǎn)置論文-數(shù)據(jù)結(jié)構(gòu)課程設(shè)計論文
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--基本稀疏矩陣運(yùn)算的運(yùn)算器
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--數(shù)據(jù)結(jié)構(gòu)的實(shí)現(xiàn)
- 數(shù)據(jù)結(jié)構(gòu)及其應(yīng)用(算法與數(shù)據(jù)結(jié)構(gòu)課程設(shè)計)
- 課程設(shè)計---稀疏矩陣應(yīng)用
- 數(shù)據(jù)結(jié)構(gòu)-矩陣相關(guān)操作的課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--數(shù)據(jù)結(jié)構(gòu)課程設(shè)計----huffman編碼
- 數(shù)據(jù)結(jié)構(gòu)-基于三元組表的存儲結(jié)構(gòu)實(shí)現(xiàn)稀疏矩陣的應(yīng)用-課程設(shè)計-實(shí)驗(yàn)報告
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--矩陣的加、減、乘法運(yùn)算的實(shí)現(xiàn)
評論
0/150
提交評論