版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1、<p><b> 數(shù)據(jù)結(jié)構(gòu)</b></p><p><b> 課程設(shè)計報告</b></p><p> 設(shè)計題目:稀疏矩陣運(yùn)算器</p><p> 班 級 計科112班 </p><p> 學(xué) 號
2、 </p><p> 姓 名 </p><p> 指導(dǎo)教師 </p><p> 起止時間 2013.10.14—2013.10.18 </p><p> 成 績
3、 </p><p> 2013—2014 年 一 學(xué)期</p><p><b> 一、實驗?zāi)康?</b></p><p> 通過實習(xí),了解并初步掌握設(shè)計、實現(xiàn)較大系統(tǒng)的完整過程,包括系統(tǒng)分析、編碼設(shè)計、系統(tǒng)集成、以及調(diào)試分析,熟練掌握數(shù)據(jù)結(jié)構(gòu)的選擇、設(shè)計、實現(xiàn)以及操作方法,為進(jìn)一步的應(yīng)
4、用開發(fā)打好基礎(chǔ)。</p><p><b> 問題描述</b></p><p> 稀疏矩陣是指那些多數(shù)元素為零的矩陣。利用“稀疏”特點進(jìn)行存儲和計算可以大大節(jié)省存儲空間,提高計算效率。實現(xiàn)一個能進(jìn)行稀疏矩陣基本運(yùn)算的運(yùn)算器。</p><p><b> 條件分析</b></p><p> 以“帶
5、行邏輯鏈接信息”的三元組順序表表示稀疏矩陣,實現(xiàn)矩陣轉(zhuǎn)置,求逆,實現(xiàn)兩個矩陣相加、相減和相乘的運(yùn)算。稀疏矩陣的輸入形式采用三元組表示,而運(yùn)算結(jié)果的矩陣則以通常的陣列形式列出。 </p><p> 演示程序以用戶和計算機(jī)的對話方式執(zhí)行,數(shù)組的建立方式為邊輸入邊建立。</p><p> 由題目要求可知:首先應(yīng)輸入矩陣的行數(shù)和列數(shù),并判別給出的兩個矩陣的行、列數(shù)對于所要求作的運(yùn)算是否相匹配。
6、</p><p> 程序可以對三元組的輸入順序不加以限制;根據(jù)對矩陣的行列,三元組作直接插入排序,從而進(jìn)行運(yùn)算時,不會產(chǎn)生錯誤。</p><p> 在用三元組表示稀疏矩陣時,相加、乘積和相減所得結(jié)果矩陣應(yīng)該另生成;矩陣求逆時,為了算法方便,使用二維數(shù)組存放。 </p><p><b> 測試數(shù)據(jù)如下:</b></p><
7、;p> 10 0 0 0 0 0 10 0 0</p><p> 0 0 0 + 0 0 -1 = 0 0 8</p><p> -1 0 0 1 0 -3 0 0 -3</p><p> 10 0 0 0 10 0<
8、;/p><p> 0 9 - 0 -1 = 0 10 </p><p> -1 0 1 -3 -2 3</p><p> 1 0 0 1 0 1 0</p><p> 0 2 0 × 0 0
9、 = 0 0</p><p> 0 0 3 1 0 3 0</p><p><b> 概要設(shè)計</b></p><p> 抽象數(shù)據(jù)類型稀疏矩陣的定義如下:</p><p> ADT SparseMatrix{</p><p>
10、; 數(shù)據(jù)對象:D={aij|i=1,2,…,m; j=1,2,…,n;</p><p> aij∈ElemSet, m和n分別為矩陣的行數(shù)和列數(shù)}</p><p> 數(shù)據(jù)關(guān)系:R={Row,Colum }</p><p> Row={﹤ai,j, ai,j+1﹥| 1≤i≤m, 1≤j≤n-1}</p><p> Colum =
11、{﹤ai,j, ai+1,j﹥| 1≤i≤m-1, 1≤j≤n}</p><p><b> 基本操作:</b></p><p> creat_matrix(crosslist TM)</p><p> 操作結(jié)果:創(chuàng)建稀疏矩陣矩陣TM</p><p> print_matrix(crosslist TM)<
12、/p><p> 初始條件:稀疏矩陣TM存在</p><p> 操作結(jié)果:通常形式輸出稀疏矩陣</p><p> add_matrix(crosslist A,crosslist B,crosslist &C) </p><p> 初始條件:稀疏矩陣A,B和C存在</p><p> 操作結(jié)果:稀疏矩陣
13、的加法運(yùn)算:C=A+B</p><p> sub_matrix(crosslist A,crosslist B,crosslist &C)</p><p> 初始條件:稀疏矩陣A,B和C存在</p><p> 操作結(jié)果:稀疏矩陣的減法運(yùn)算:C=A-B</p><p> multi_matrix(crosslist A,cros
14、slist B,crosslist &C)</p><p> 初始條件:稀疏矩陣A,B和C存在</p><p> 操作結(jié)果:稀疏矩陣的乘法運(yùn)算:C=A×B </p><p> }ADT SparseMatrix;</p><p><b> 2.主程序:</b></p><
15、;p> void main( )</p><p><b> {初始化;</b></p><p><b> do {</b></p><p><b> 接受命令;</b></p><p><b> 選擇處理命令;</b></p>
16、<p><b> }</b></p><p> while(命令!=“退出”)</p><p> 3.本程序有四個模塊,調(diào)用關(guān)系如下:</p><p><b> 主程序模塊</b></p><p><b> 創(chuàng)建矩陣模塊</b></p>&l
17、t;p><b> 矩陣運(yùn)算模塊</b></p><p><b> 矩陣輸出模塊</b></p><p><b> 程序設(shè)計</b></p><p><b> 1、矩陣的定義</b></p><p> typedef struct list&
18、lt;/p><p> { int row; </p><p> int colum;</p><p> int value; </p><p> struct list *right;</p><p> struct list *down;</p><p>
19、}node,*element;</p><p> typedef struct link</p><p> { int row_size;//矩陣的行數(shù)</p><p> int colum_size;//矩陣的列數(shù)</p><p> int non_zero_amount;//非零元素的個數(shù)</p><p&
20、gt; element *rhead;//行鏈表頭指針基址</p><p> element *chead;//列鏈表頭指針基址</p><p> }crosslist;</p><p> 2、基本操作設(shè)定為:</p><p> 稀疏矩陣的基本操作設(shè)置如下:</p><p> int creat_matri
21、x(crosslist &one);//用十字鏈表創(chuàng)建稀疏矩陣</p><p> int print_matrix(crosslist &one) //輸出稀疏矩陣</p><p> int add_matrix(crosslist one,crosslist two,crosslist &three) //加法運(yùn)算</p><
22、p> int sub_matrix(crosslist M,crosslist N,crosslist &Q) //矩陣相減</p><p> int multi_matrix(crosslist one,crosslist two,crosslist &three) //矩陣相乘</p><p> int main(void) //主
23、函數(shù)</p><p><b> 函數(shù)的調(diào)用關(guān)系圖 </b></p><p><b> 六、測試結(jié)果 </b></p><p> 1.按題目測試要求輸入:</p><p><b> ?。?)程序主頁面</b></p><p><b>
24、?。?)矩陣相加</b></p><p><b> ?。?)矩陣相減</b></p><p><b> ?。?)矩陣相乘</b></p><p><b> (5)退出系統(tǒng)</b></p><p><b> 結(jié)果分析</b></p>
25、;<p> 本次作業(yè)中,稀疏矩陣在書本有較詳細(xì)的說明,給予了本次作業(yè)一個較大的幫助。</p><p> 整個程序主要運(yùn)用了矩陣運(yùn)算的規(guī)則,利用創(chuàng)建矩陣,分析數(shù)據(jù),行列是否匹配,矩陣運(yùn)算,矩陣輸出。</p><p> 整個程序運(yùn)行期間不是實行動態(tài)存儲管理,故占用空間比較大;特別是執(zhí)行稀疏矩陣的求逆過程。</p><p> 主要算法的時空分析:&l
26、t;/p><p> 加法,減法和乘法時間復(fù)雜度為:O(m×n)。</p><p><b> 參考資料</b></p><p> 《數(shù)據(jù)結(jié)構(gòu)》(C語言版)——清華大學(xué)出版社; 作者: 嚴(yán)蔚敏、吳偉民;</p><p> 《數(shù)據(jù)結(jié)構(gòu)題集》(C語言版)——清華大學(xué)出版社; 作者: 嚴(yán)蔚敏、吳偉民、米寧
27、</p><p> 《程序設(shè)計題典》(C語言版)——清華大學(xué)出版社; 作者: 李春葆</p><p><b> 附源程序:</b></p><p> //用十字鏈表創(chuàng)建稀疏矩陣,求矩陣的加,減,乘,并且矩陣的輸入輸出都以常規(guī)矩陣形式</p><p> #include <stdio.h></p
28、><p> #include <stdlib.h></p><p> #include <assert.h></p><p> #include <windows.h></p><p> #define OVERFLOW -1</p><p> #define OK 1
29、</p><p> #define ERROR 0</p><p> typedef struct list</p><p> { int row; </p><p> int colum;</p><p> int value; </p><p> s
30、truct list *right;</p><p> struct list *down;</p><p> }node,*element;</p><p> typedef struct link</p><p> { int row_size; //矩陣的行數(shù)</p><p>
31、; int colum_size; //矩陣的列數(shù)</p><p> int non_zero_amount; //非零元素的個數(shù)</p><p> element *rhead; //行鏈表頭指針基址</p><p> element *chead; //列鏈表頭指針基址</p><p> }
32、crosslist;</p><p> int init_matrix(crosslist &one) //矩陣的初始化 </p><p><b> {</b></p><p> one.row_size=0;</p><p> one.colum_size=0;
33、 </p><p> one.non_zero_amount=0;</p><p> one.rhead=NULL;</p><p> one.chead=NULL;</p><p> return OK;
34、 </p><p><b> }</b></p><p> int crea
35、t_matrix(crosslist &one) //用十字鏈表創(chuàng)建稀疏矩陣 </p><p><b> {</b></p><p> int m,n,t,i,j,k,a;</p><p> element p,q;</p><p> if(one.rhead)</p><
36、p><b> {</b></p><p> one.rhead=NULL;</p><p> one.chead=NULL;</p><p> one.row_size=0;</p><p> one.colum_size=0;</p><p> one.non_zero_amo
37、unt=0;</p><p><b> }</b></p><p> printf("\n請輸入稀疏矩陣的行數(shù) 列數(shù) 非零元個數(shù):");</p><p> scanf("%d %d %d",&m,&n,&t);</p><p> one.row_
38、size=m;</p><p> one.colum_size=n;</p><p> one.non_zero_amount=t;</p><p> if(!(one.rhead=(element *)malloc((m+1)*sizeof(element))))exit(OVERFLOW); //分配單元</p><p>
39、if(!(one.chead=(element *)malloc((n+1)*sizeof(element))))exit(OVERFLOW);</p><p> for(i=1;i<=one.row_size+1;i++)</p><p><b> {</b></p><p> one.rhead[i]=NULL;</p&g
40、t;<p><b> }</b></p><p> for(i=1;i<=one.colum_size+1;i++)</p><p><b> {</b></p><p> one.chead[i]=NULL; </p><p><b> }</
41、b></p><p> for(k=1;k<=one.non_zero_amount;k++)</p><p><b> {</b></p><p> printf("\n請輸入第%d個非零元的行號 列號 非零元素值:",k);</p><p> scanf("%d %d
42、 %d",&i,&j,&a);</p><p> if(!(p=(list *)malloc(sizeof(list))))exit(OVERFLOW);</p><p><b> p->row=i;</b></p><p> p->colum=j;</p><p>
43、 p->value=a; // 生成結(jié)點</p><p> if(one.rhead[i]==NULL||one.rhead[i]->colum>j)</p><p><b> {</b></p><p> p->right=one.rhead[i]; </p><p>
44、; one.rhead[i]=p;</p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> for(q=one.rhead[i];(q->right)&&q->
45、;right->colum<j;q=q->right);</p><p> p->right=q->right;</p><p> q->right=p; //尋找在行中的插入位置</p><p><b> }</b></p><p> if(one.chead[j
46、]==NULL||one.chead[j]->row>i)</p><p><b> {</b></p><p> p->down=one.chead[j];</p><p> one.chead[j]=p;</p><p><b> }</b></p>&l
47、t;p><b> else</b></p><p><b> {</b></p><p> for(q=one.chead[j];(q->down)&&q->down->row<i;q=q->down);</p><p> p->down=q->dow
48、n;</p><p> q->down=p; //尋找在列中的插入位置</p><p><b> }</b></p><p><b> }</b></p><p> return(0);</p><p> }//輸出十字鏈表的函數(shù) </p>
49、;<p> int print_matrix(crosslist &one) //打印出稀疏矩陣</p><p><b> {</b></p><p><b> int i,j;</b></p><p><b> int b=0;</b></p>
50、<p> element p;</p><p> for(i=1;i<=one.row_size;i++)</p><p><b> {</b></p><p> p=one.rhead[i];</p><p> printf("\t\t\t\t ");</p>
51、;<p> for(j=1;j<=one.colum_size;j++)</p><p><b> { </b></p><p> if(p!=NULL)</p><p><b> {</b></p><p> if(j==p->colum)</p&g
52、t;<p><b> {</b></p><p> printf("%4d",p->value );</p><p> p=p->right;</p><p><b> }</b></p><p><b> else</b>
53、;</p><p> printf("%4d",b);</p><p><b> }</b></p><p><b> else</b></p><p> printf("%4d",b);</p><p><b>
54、}</b></p><p> printf(" \n");</p><p><b> }</b></p><p> return(0);</p><p><b> }</b></p><p> int add_matrix(cross
55、list one,crosslist two,crosslist &three) //加法運(yùn)算</p><p><b> {</b></p><p> /*兩個矩陣相加*/</p><p> assert(one.row_size==two.row_size&&one.colum_size==two.col
56、um_size);</p><p> int i,j; //作為計數(shù)的循環(huán)</p><p> element insert; //結(jié)點插入</p><p> element pone,ptwo;</p><p> element prow;
57、 //行的最后一個結(jié)點</p><p> element *pcolum; //行列的最后一個結(jié)點</p><p> three.row_size=one.row_size;</p><p> three.colum_size=one.colum_size;</p><p> t
58、hree.non_zero_amount=0;</p><p> three.rhead=(element*)malloc(sizeof(element)*(three.row_size+1));</p><p> assert(three.rhead!=NULL);</p><p> three.chead=(element*)malloc(sizeof(e
59、lement)*(three.colum_size+1));</p><p> assert(three.chead!=NULL);</p><p> pcolum=(element*)malloc(sizeof(element)*(three.colum_size+1));</p><p> assert(pcolum!=NULL);</p>
60、<p> for(i=1;i<=three.row_size;i++)</p><p> three.rhead[i]=NULL;</p><p> for(i=1;i<=three.colum_size;i++)</p><p> three.chead[i]=NULL;</p><p> for(i=1;i
61、<=three.colum_size;i++)</p><p> pcolum[i]=NULL;</p><p> /*給相加后的結(jié)果排序*/</p><p> for(i=1;i<=one.row_size;i++)</p><p><b> {</b></p><p>
62、pone=one.rhead[i];</p><p> ptwo=two.rhead[i]; </p><p> while(pone!=NULL&&ptwo!=NULL)</p><p> {//both have nodes in the same row</p><p> if(pone->colum
63、<ptwo->colum) //第一個矩陣的列數(shù)較小</p><p><b> {</b></p><p> insert=(element)malloc(sizeof(node));</p><p> assert(insert!=NULL);</p><p> insert->r
64、ow=i;</p><p> insert->colum=pone->colum;</p><p> insert->value=pone->value;</p><p> insert->right=NULL;</p><p> pone=pone->right;</p><p
65、> three.non_zero_amount++;</p><p><b> }</b></p><p><b> else </b></p><p> if(pone->colum>ptwo->colum) //第二個矩陣的列數(shù)較小 </p><p><
66、;b> {</b></p><p> insert=(element)malloc(sizeof(node));</p><p> assert(insert!=NULL);</p><p> insert->row=i;</p><p> insert->colum=ptwo->colum;&l
67、t;/p><p> insert->value=ptwo->value;</p><p> insert->right=NULL;</p><p> ptwo=ptwo->right;</p><p> three.non_zero_amount++;</p><p><b>
68、}</b></p><p><b> else</b></p><p> if(pone->value+ptwo->value!=0)//相加后的結(jié)果是非零元素</p><p><b> {</b></p><p> insert=(element)malloc(si
69、zeof(node));</p><p> assert(insert!=NULL);</p><p> insert->row=i;</p><p> insert->colum=ptwo->colum;</p><p> insert->value=pone->value+ptwo->value
70、;</p><p> insert->right=NULL;</p><p> pone=pone->right;</p><p> ptwo=ptwo->right;</p><p> three.non_zero_amount++;</p><p><b> }</b&g
71、t;</p><p> else //相加結(jié)果是零</p><p><b> {</b></p><p> pone=pone->right;</p><p> ptwo=ptwo->right;</p><p><
72、b> continue;</b></p><p><b> }</b></p><p> if(three.rhead[i]==NULL)</p><p> three.rhead[i]=prow=insert;</p><p><b> else</b></p&g
73、t;<p><b> {</b></p><p> prow->right=insert;</p><p> prow=insert;</p><p><b> }</b></p><p> if(three.chead[insert->colum]==NULL)
74、</p><p> three.chead[insert->colum]=pcolum[insert->colum]=insert;</p><p><b> else</b></p><p><b> {</b></p><p> pcolum[insert->colum
75、]->down=insert;</p><p> pcolum[insert->colum]=insert;</p><p><b> }</b></p><p><b> }</b></p><p> while(pone!=NULL) </p><p&
76、gt;<b> {</b></p><p> insert=(element)malloc(sizeof(node));</p><p> assert(insert!=NULL);</p><p> insert->row=i;</p><p> insert->colum=pone->co
77、lum;</p><p> insert->value=pone->value;</p><p> insert->right=NULL;</p><p> pone=pone->right; </p><p> three.non_zero_amount++;&l
78、t;/p><p> if(three.rhead[i]==NULL)</p><p> three.rhead[i]=prow=insert;</p><p><b> else</b></p><p><b> {</b></p><p> prow->righ
79、t=insert;</p><p> prow=insert;</p><p><b> }</b></p><p> if(three.chead[insert->colum]==NULL)</p><p> three.chead[insert->colum]=pcolum[insert->
80、colum]=insert;</p><p><b> else</b></p><p><b> {</b></p><p> pcolum[insert->colum]->down=insert;</p><p> pcolum[insert->colum]=inser
81、t;</p><p><b> }</b></p><p><b> }</b></p><p> while(ptwo!=NULL)</p><p><b> {</b></p><p> insert=(element)malloc(siz
82、eof(node));</p><p> assert(insert!=NULL);</p><p> insert->row=i;</p><p> insert->colum=ptwo->colum;</p><p> insert->value=ptwo->value;</p><
83、;p> insert->right=NULL;</p><p> ptwo=ptwo->right; </p><p> three.non_zero_amount++;</p><p> if(three.rhead[i]==NULL)</p><p> three.r
84、head[i]=prow=insert;</p><p><b> else</b></p><p><b> {</b></p><p> prow->right=insert;</p><p> prow=insert;</p><p><b>
85、 }</b></p><p> if(three.chead[insert->colum]==NULL)</p><p> three.chead[insert->colum]=pcolum[insert->colum]=insert;</p><p><b> else</b></p><
86、;p><b> {</b></p><p> pcolum[insert->colum]->down=insert;</p><p> pcolum[insert->colum]=insert;</p><p><b> }</b></p><p><b>
87、 } </b></p><p><b> }</b></p><p> three.non_zero_amount=three.non_zero_amount;</p><p> for(j=1;j<=three.colum_size;j++)</p><p> {
88、 if(pcolum[j]!=NULL)</p><p> pcolum[j]->down=NULL;</p><p><b> }</b></p><p> free(pcolum);</p><p> return OK;</p><p><b>
89、 }//矩陣相加結(jié)束</b></p><p> int sub_matrix(crosslist M,crosslist N,crosslist &Q) //矩陣相減</p><p> { // 初始條件: 稀疏矩陣M與N的行數(shù)和列數(shù)對應(yīng)相等</p><p> /
90、/ 操作結(jié)果: 求稀疏矩陣的差Q=M-N </p><p><b> int i,k;</b></p><p> element p,pq,pm,pn;</p><p> element *col;</p><p> if(M.row_size!=N.row_size||M.colum_size!=N.colum
91、_size)</p><p><b> {</b></p><p> printf("兩個矩陣不是同類型的,不能相減\n");</p><p> exit(OVERFLOW);</p><p><b> }</b></p><p> Q.row_
92、size=M.row_size; // 初始化Q矩陣 </p><p> Q.colum_size=M.colum_size;</p><p> Q.non_zero_amount=0; //元素個數(shù)的初值 </p><p> Q.rhead=(element*)mall
93、oc((Q.row_size+1)*sizeof(element));</p><p> if(!Q.rhead)</p><p> exit(OVERFLOW);</p><p> Q.chead=(element*)malloc((Q.colum_size+1)*sizeof(element));</p><p> if(!Q.c
94、head)</p><p> exit(OVERFLOW);</p><p> for(k=1;k<=Q.row_size;k++) //初始化Q的行頭指針向量;各行鏈表為空鏈表</p><p> Q.rhead[k]=NULL;</p><p> for(k=1;k<=Q.colum_size;k++
95、) //初始化Q的列頭指針向量;各列鏈表為空鏈表 </p><p> Q.chead[k]=NULL;</p><p> col=(element*)malloc((Q.colum_size+1)*sizeof(element)); // 生成指向列的最后結(jié)點的數(shù)組 </p><p><b> if(!col)</b>
96、;</p><p> exit(OVERFLOW);</p><p> for(k=1;k<=Q.colum_size;k++) // 賦初值 </p><p> col[k]=NULL;</p><p> for(i=1;i<=M.row_size;i++) //按行的順序相減 &l
97、t;/p><p><b> {</b></p><p> pm=M.rhead[i]; // pm指向矩陣M的第i行的第1個結(jié)點 </p><p> pn=N.rhead[i]; // pn指向矩陣N的第i行的第1個結(jié)點 </p><p> while(pm&a
98、mp;&pn) // pm和pn均不空 </p><p><b> {</b></p><p> if(pm->colum<pn->colum) // 矩陣M當(dāng)前結(jié)點的列小于矩陣N當(dāng)前結(jié)點的列 </p><p><b> {</b></p&
99、gt;<p> p=(element)malloc(sizeof(list)); // 生成矩陣Q的結(jié)點 </p><p><b> if(!p)</b></p><p> exit(OVERFLOW);</p><p> Q.non_zero_amount++; // 非零元素數(shù)加&
100、lt;/p><p> p->row=i; // 給結(jié)點賦值 </p><p> p->colum=pm->colum;</p><p> p->value=pm->value;</p><p> p->right=NULL;</p><p>
101、pm=pm->right; // pm指針向右移</p><p><b> }</b></p><p> else if(pm->colum>pn->colum) // 矩陣M當(dāng)前結(jié)點的列大于矩陣N當(dāng)前結(jié)點的列</p><p><b> {</b>&
102、lt;/p><p> p=(element)malloc(sizeof(list)); // 生成矩陣Q的結(jié)點 </p><p><b> if(!p)</b></p><p> exit(OVERFLOW);</p><p> Q.non_zero_amount++; // 非零元素
103、數(shù)加1</p><p> p->row=i; // 給結(jié)點賦值 </p><p> p->colum=pn->colum;</p><p> p->value=-pn->value;</p><p> p->right=NULL;</p><p>
104、 pn=pn->right; // pn指針向右移 </p><p><b> }</b></p><p> else if(pm->value-pn->value) //矩陣M、N當(dāng)前結(jié)點的列相等且兩元素之差不為0</p><p><b> {</b></
105、p><p> p=(element)malloc(sizeof(list)); // 生成矩陣Q的結(jié)點 </p><p><b> if(!p)</b></p><p> exit(OVERFLOW);</p><p> Q.non_zero_amount++; // 非零元素數(shù)
106、加1</p><p> p->row=i; // 給結(jié)點賦值 </p><p> p->colum=pn->colum;</p><p> p->value=pm->value-pn->value;</p><p> p->right=NULL;</p&
107、gt;<p> pm=pm->right; // pm指針向右移 </p><p> pn=pn->right; // pn指針向右移</p><p><b> }</b></p><p> else // 矩陣M、N當(dāng)前結(jié)
108、點的列相等且兩元素之差為0</p><p><b> {</b></p><p> pm=pm->right; // pm指針向右移 </p><p> pn=pn->right; // pn指針向右移 </p><p><b> continue;<
109、/b></p><p><b> }</b></p><p> if(Q.rhead[i]==NULL) // p為該行的第1個結(jié)點</p><p> Q.rhead[i]=pq=p; // p插在該行的表頭且pq指向p(該行的最后一個結(jié)點)</p><p> else
110、// 插在pq所指結(jié)點之后 </p><p><b> {</b></p><p> pq->right=p; // 完成行插入 </p><p> pq=pq->right; // pq指向該行的最后一個結(jié)點</p><
111、;p><b> }</b></p><p> if(Q.chead[p->colum]==NULL) //p為該列的第1個結(jié)點 </p><p> Q.chead[p->colum]=col[p->colum]=p; // p插在該列的表頭且col[p->j]指向p </p><
112、p> else // 插在col[p->]所指結(jié)點之后 </p><p><b> {</b></p><p> col[p->colum]->down=p; // 完成列插入 </p><p> col[p->
113、colum]=col[p->colum]->down; // col[p->j]指向該列的最后一個結(jié)點</p><p><b> }</b></p><p><b> }</b></p><p> while(pm) // 將矩陣M該行的剩
114、余元素插入矩陣Q </p><p><b> {</b></p><p> p=(element)malloc(sizeof(list)); // 生成矩陣Q的結(jié)點 </p><p><b> if(!p)</b></p><p> exit(OVERFLOW);</p>&l
115、t;p> Q.non_zero_amount++; // 非零元素數(shù)加1</p><p> p->row=i; // 給結(jié)點賦值 </p><p> p->colum=pm->colum;</p><p> p->value=pm->value;&l
116、t;/p><p> p->right=NULL;</p><p> pm=pm->right; // pm指針向右移 </p><p> if(Q.rhead[i]==NULL) // p為該行的第1個結(jié)點</p><p> Q.rhead[i]=pq=p; // p插在該行的表頭且p
117、q指向p(該行的最后一個結(jié)點)</p><p> else // 插在pq所指結(jié)點之后 </p><p><b> {</b></p><p> pq->right=p; // 完成行插入</p><p&g
118、t; pq=pq->right; // pq指向該行的最后一個結(jié)點</p><p><b> }</b></p><p> if(Q.chead[p->colum]==NULL) // p為該列的第1個結(jié)點 </p><p> Q.chead[p->colum
119、]=col[p->colum]=p; // p插在該列的表頭且col[p->j]指向p</p><p> else // 插在col[p->j]所指結(jié)點之后 </p><p><b> {</b></p><p> col[p->colum]-&g
120、t;down=p; // 完成列插入 </p><p> col[p->colum]=col[p->colum]->down; //col[p->j]指向該列的最后一個結(jié)點 </p><p><b> }</b></p><p><b> }</b></p&g
121、t;<p> while(pn) // 將矩陣N該行的剩余元素插入矩陣Q </p><p><b> {</b></p><p> p=(element)malloc(sizeof(list)); // 生成矩陣Q的結(jié)點 </p><p><b> if(!p)
122、</b></p><p> exit(OVERFLOW);</p><p> Q.non_zero_amount++; // 非零元素數(shù)加1</p><p> p->row=i; // 給結(jié)點賦值 </p><p> p->col
123、um=pn->colum;</p><p> p->value=-pn->value;</p><p> p->right=NULL;</p><p> pn=pn->right; // pm指針向右移</p><p> if(Q.rhead[i]==NULL) /
124、/ p為該行的第1個結(jié)點</p><p> Q.rhead[i]=pq=p; // p插在該行的表頭且pq指向p(該行的最后一個結(jié)點) </p><p> else //插在pq所指結(jié)點之后</p><p><b> {</b></p><p> pq->
125、;right=p; //完成行插入 </p><p> pq=pq->right; // pq指向該行的最后一個結(jié)點 </p><p><b> }</b></p><p> if(Q.chead[p->colum]==NULL) // p為該列的第1個結(jié)點 </
126、p><p> Q.chead[p->colum]=col[p->colum]=p; // p插在該列的表頭且col[p->j]指向p </p><p> else // 插在col[p->j]所指結(jié)點之后 </p><p><b> {</b>
127、;</p><p> col[p->colum]->down=p; // 完成列插入 </p><p> col[p->colum]=col[p->colum]->down; // col[p->j]指向該列的最后一個結(jié)點 </p><p><b> }</b></p
128、><p><b> }</b></p><p><b> }</b></p><p> for(k=1;k<=Q.colum_size;k++)</p><p> if(col[k]) // k列有結(jié)點 </p><p>
129、 col[k]->down=NULL; // 令該列最后一個結(jié)點的down指針為空 </p><p> free(col);</p><p> return OK;</p><p><b> }</b></p><p> int multi_matrix(crosslist one,
130、crosslist two,crosslist &three) //矩陣相乘</p><p><b> {</b></p><p> /*把兩個矩陣相乘*/</p><p> assert(one.colum_size==two.row_size);</p><p> int i,j;//as
131、count in the loop</p><p> int value;//temp total value</p><p> element insert;//the node to insert into three</p><p> element pone,ptwo;//use in traverse the node in one and two&
132、lt;/p><p> element prow,pcolum;//mark the last row and colum node</p><p> /*assignment*/</p><p> three.row_size=one.row_size;</p><p> three.colum_size=two.colum_size;&
133、lt;/p><p> three.non_zero_amount=0; </p><p> /*allocate memroy*/</p><p> three.rhead=(element*)malloc(sizeof(element)*(three.row_size+1));</p><p> assert(thre
134、e.rhead!=NULL);</p><p> three.chead=(element*)malloc(sizeof(element)*(three.colum_size+1));</p><p> assert(three.chead!=NULL); </p><p> /*initialization*/</p><p&
135、gt; for(i=1;i<=three.row_size;i++)</p><p> three.rhead[i]=NULL;</p><p> for(i=1;i<=three.colum_size;i++)</p><p> three.chead[i]=NULL; </p><p><b>
溫馨提示
- 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è)計報告--稀疏矩陣運(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è)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計--基本稀疏矩陣運(yùn)算的運(yùn)算器
- 課程設(shè)計---稀疏矩陣加法運(yùn)算器
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-- 稀疏矩陣的運(yù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è)計--稀疏矩陣的操作
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計-稀疏矩陣實現(xiàn)與應(yīng)用
- 課程設(shè)計--設(shè)計一個矩陣運(yùn)算器
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計論文----稀疏矩陣的轉(zhuǎn)置
- 稀疏矩陣的轉(zhuǎn)置論文-數(shù)據(jù)結(jié)構(gòu)課程設(shè)計論文
- 數(shù)電課程設(shè)計報告---運(yùn)算器
- 稀疏矩陣的運(yùn)算課程設(shè)計
- 稀疏矩陣的運(yùn)算課程設(shè)計
- 數(shù)據(jù)結(jié)構(gòu)課程設(shè)計報告-長整數(shù)運(yùn)算
- 數(shù)據(jù)結(jié)構(gòu)實驗報告(稀疏矩陣)
評論
0/150
提交評論