版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、<p><b> 數 據 結 構</b></p><p> 課 程 設 計 說 明 書</p><p> 學 院:電子與計算機科學技術學院</p><p> 專 業(yè):計算機科學與技術</p><p> 題 目:稀疏矩陣運算器</p><p> 指導教師:</p>
2、<p> 組長姓名:學號</p><p> 組員姓名:學號</p><p> 組員姓名:學號</p><p> 組員姓名:學號</p><p><b> 1. 概述1</b></p><p> 1.1 設計目的2</p><p> 1.2 設計目標及要求
3、設計要求2</p><p> 1.3 設計進度2</p><p><b> 1.4 分工2</b></p><p> 2. 需求分析及總體設計3</p><p> 2.1 數據結構3</p><p> 2.2 功能框架4</p><p> 3.功能模
4、塊詳細設計4</p><p><b> 3.1設計流程4</b></p><p> 3.2主要源代碼4</p><p> 4.功能模塊詳細設計7</p><p><b> 4.1設計流程7</b></p><p> 4.2主要源代碼7</p>
5、<p> 5.功能模塊詳細設計12</p><p> 5.1設計流程12</p><p> 5.2主要源代碼...............................................................................................................12</p><p
6、><b> 1</b></p><p> 6.功能模塊詳細設計14</p><p> 6.1設計流程14</p><p> 6.2主要源代碼............................................................................................14
7、</p><p> 7.總程序及結果18</p><p><b> 7.1程序18</b></p><p> 7.2結果………............................................................................................29</p>
8、<p><b> 1. 概述 </b></p><p><b> 1.1 設計目的</b></p><p> 用數組及“帶行邏輯連接信息”的三元組順序表表示稀疏矩陣。能夠用三元組順序表簡單快捷的存取稀疏矩陣,減少存儲空間,并且將矩陣以通常的陣列形式列出。</p><p> 1.2 設計目標及要求設計要求
9、</p><p> 用程序代碼編寫實現兩個稀疏矩陣相加、相減、相乘和求逆的運算,稀疏矩陣的輸入形式采用三元組表示,而運算結果的矩陣采用通常的陣列形式列出。</p><p> 2. 需求分析及總體設計</p><p><b> 2.1 數據結構</b></p><p> 抽象數據類型稀疏矩陣的定義如下:</p
10、><p> ADT SparseMatrix{</p><p> 數據對象:D={aij|i=1,2,…,m; j=1,2,…,n;</p><p> aij∈ElemSet, m和n分別為矩陣的行數和列數}</p><p> 數據關系:R={Row,Col }</p><p> Row={﹤ai,j, ai,j
11、+1﹥| 1≤i≤m, 1≤j≤n-1}</p><p> Col = {﹤ai,j, ai+1,j﹥| 1≤i≤m-1, 1≤j≤n}</p><p><b> 基本操作:</b></p><p> CreateSMatrix (RLSMatrix *M)</p><p> 操作結果:創(chuàng)建稀疏矩陣矩陣M&l
12、t;/p><p> PrintSMatrix (RLSMatrix M)</p><p> 初始條件:稀疏矩陣TM存在</p><p> 操作結果:通常形式輸出稀疏矩陣</p><p> Add (RLSMatrix M,RLSMatrix N,RLSMatrix *Q)</p><p> 初始條件:稀疏矩陣A
13、,B和C存在</p><p> 操作結果:稀疏矩陣的加法運算:C=A+B</p><p> subtraction (RLSMatrix M,RLSMatrix N,RLSMatrix *Q) </p><p> 初始條件:稀疏矩陣A,B和C存在</p><p> 操作結果:稀疏矩陣的減法運算:C=A-B</p>
14、<p> MultSMatrix (RLSMatrix M,RLSMatrix N,RLSMatrix *Q)</p><p> 初始條件:稀疏矩陣A,B和C存在</p><p> 操作結果:稀疏矩陣的乘法運算:C=A×B </p><p> NiMatrix(RLSMatrix &TM)</p><p&
15、gt; 初始條件:稀疏矩陣TM存在</p><p> 操作結果:稀疏矩陣求逆</p><p> }ADT SparseMatrix;</p><p><b> 2.2 功能框架</b></p><p><b> main</b></p><p><b>
16、 create</b></p><p><b> print</b></p><p> Add subtraction MultSMatrix NiMatrix </p><p> JsMatrix N1M
17、atrix</p><p><b> 功能模塊詳細設計</b></p><p> ?。ㄏ∈杈仃嚨膭?chuàng)建及輸出)</p><p><b> 3.1設計流程</b></p><p> 用結構體類型定義三元順序表M,輸入行值、列值、及元素的值,賦值于結構體M中data值以便于稀疏矩陣的壓縮存儲,再輸出
18、函數時,從行開始循環(huán),將每行每列的非零元輸出,并用列陣形式表示</p><p><b> 3.2主要源代碼</b></p><p> #include<stdio.h></p><p> #include<math.h></p><p> #define maxsize 100/*
19、原稀疏矩陣中非零元個數的最大值*/</p><p> #define maxrc 100/* 最大階(行)數*/</p><p> #define OK 1</p><p> #define ERROR 0</p><p> typedef struct/*定義非零元的三元組*/</p><p>&
20、lt;b> {</b></p><p> int i,j; /* 行下標,列下標*/</p><p> int e; /* 非零元素值*/</p><p><b> }Triple; </b></p><p> typedef struct/*定義稀疏矩陣的結構體*/</p>
21、<p><b> {</b></p><p> Triple data[maxsize+1]; /* 非零元三元組表,data[0]未用*/</p><p> int rpos[maxrc+1]; /* 各行第一個非零元素的位置表*/</p><p> int mu,nu,tu; /* 矩陣的行數、列數和非零元個數*/&l
22、t;/p><p> }RLSMatrix;</p><p> int CreateSMatrix (RLSMatrix *M)/* 創(chuàng)建稀疏矩陣M */</p><p><b> {</b></p><p> int i,j,k,p;</p><p><b> Triple T
23、;</b></p><p> printf ("請輸入矩陣的行數,列數,非零元素數:");</p><p> scanf("%d,%d,%d",&(*M).mu,&(*M).nu,&(*M).tu);</p><p> for (i=1;i<=(*M).tu;i++)</p
24、><p><b> {</b></p><p><b> do</b></p><p><b> {</b></p><p> printf ("請按行序為主序輸入第%d個非零元素所在的行(1~%d),列(1~%d),元素值:",i,(*M).mu,(*
25、M).nu);</p><p> scanf ("%d,%d,%d",&T.i,&T.j,&T.e);</p><p> if (T.i>(*M).mu||T.i<0||T.j>(*M).nu||T.j<0)</p><p> printf ("不符合條件,請重新輸入\n"
26、);</p><p><b> k=0;</b></p><p> if (T.i<1||T.i>(*M).mu||T.j<1||T.j>(*M).nu) /* 行、列超出范圍*/</p><p><b> k=1;</b></p><p> if (T.i<(
27、*M).data[i-1].i||T.i==(*M).data[i-1].i&&T.j<=(*M).data[i-1].j) /* 沒有按順序輸入非零元素*/</p><p><b> k=1;</b></p><p> }while (k); /* 當輸入有誤,重新輸入*/</p><p> (*M).data[i
28、]=T;</p><p><b> }</b></p><p><b> p=1;</b></p><p> (*M).rpos[1]=1;</p><p> for (i=1;i<=(*M).mu;i++) /* 計算rpos[] */</p><p><
29、;b> {</b></p><p><b> k=0;</b></p><p> for (j=1;j<(*M).nu;j++)</p><p><b> {</b></p><p> if ((*M).data[p].i==i)</p><p&
30、gt;<b> {</b></p><p><b> k++;</b></p><p><b> p++;</b></p><p><b> }</b></p><p> else if ((*M).data[p].i!=i) break;&
31、lt;/p><p><b> }</b></p><p> (*M).rpos[i+1]=(*M).rpos[i]+k;</p><p><b> }</b></p><p> return OK;</p><p><b> }</b></p
32、><p> void PrintSMatrix (RLSMatrix M)/* 以陣列式輸出稀疏矩陣M */</p><p><b> {</b></p><p> int i,j,k;</p><p><b> k=1;</b></p><p> for (i=
33、1;i<=M.mu;i++)</p><p><b> {</b></p><p> for (j=1;j<=M.nu;j++)</p><p><b> {</b></p><p> if ((M.data[k].i==i)&&(M.data[k].j==j))
34、</p><p><b> {</b></p><p> printf ("%d ",M.data[k].e);</p><p><b> k++;</b></p><p><b> }</b></p><p><b&g
35、t; else</b></p><p> printf ("0 ");</p><p><b> }</b></p><p> printf ("\n");</p><p><b> }</b></p><p>&
36、lt;b> }</b></p><p><b> 功能模塊詳細設計</b></p><p> ?。ㄏ∈杈仃嚰?、減法)</p><p><b> 4.1設計流程</b></p><p> 判斷是否符合加、減法的條件,如不符合,則重新輸入符合條件的矩陣 ,再進行計算,最后得出結
37、果。</p><p><b> 4.2主要源代碼</b></p><p> int Add (RLSMatrix M,RLSMatrix N,RLSMatrix *Q)</p><p><b> {</b></p><p> int i,j,k;</p><p>
38、if (M.mu!=N.mu||M.nu!=N.nu)/*判斷做加法運算的條件*/</p><p><b> {</b></p><p> printf ("不符合條件\n");</p><p> printf("重新輸入一個符合條件的矩陣B:");</p><p>
39、CreateSMatrix(&N);</p><p><b> }</b></p><p><b> k=1;</b></p><p> (*Q).mu=M.mu;</p><p> (*Q).nu=M.nu;</p><p> (*Q).tu=0;
40、/*對結果矩陣的初始化*/</p><p> for (i=1,j=1;i<=M.tu||j<=N.tu;)</p><p><b> {</b></p><p> if ((M.data[i].i==N.data[j].i)&&(M.data[i].j==N.data[j].j))</p>&l
41、t;p><b> {</b></p><p> (*Q).data[k].e=M.data[i].e+N.data[j].e;</p><p> (*Q).data[k].i=M.data[i].i;</p><p> (*Q).data[k].j=M.data[i].j;</p><p><b>
42、; i++;</b></p><p><b> j++;</b></p><p><b> k++;</b></p><p><b> }</b></p><p> if ((M.data[i].i==N.data[j].i)&&(M.da
43、ta[i].j<N.data[j].j)||(M.data[i].i<N.data[j].i))</p><p><b> {</b></p><p> if (M.data[i].i>0)</p><p><b> {</b></p><p> (*Q).data[k].
44、e=M.data[i].e;</p><p> (*Q).data[k].i=M.data[i].i;</p><p> (*Q).data[k].j=M.data[i].j;</p><p><b> k++;</b></p><p><b> i++;</b></p>&l
45、t;p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> (*Q).data[k].e=N.data[j].e;</p><p> (*Q).data[k].i=N.data[j].i;&l
46、t;/p><p> (*Q).data[k].j=N.data[j].j;</p><p><b> k++;</b></p><p><b> j++;</b></p><p><b> }</b></p><p><b> }<
47、/b></p><p> if ((M.data[i].i==N.data[j].i)&&(M.data[i].j>N.data[j].j)||(M.data[i].i>N.data[j].i))</p><p><b> {</b></p><p> if (N.data[i].i>0)</
48、p><p><b> {</b></p><p> (*Q).data[k].e=N.data[j].e;</p><p> (*Q).data[k].i=N.data[j].i;</p><p> (*Q).data[k].j=N.data[j].j;</p><p><b>
49、j++;</b></p><p><b> k++;</b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> (*Q).
50、data[k].e=M.data[j].e;</p><p> (*Q).data[k].i=M.data[j].i;</p><p> (*Q).data[k].j=M.data[j].j;</p><p><b> k++;</b></p><p><b> i++;</b></p
51、><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> (*Q).tu=k-1;</p><p> printf ("兩矩陣相加: \n") ;</p&
52、gt;<p> return OK;</p><p><b> }</b></p><p> int subtraction (RLSMatrix M,RLSMatrix N,RLSMatrix *Q)</p><p><b> {</b></p><p> int i,j,
53、k;</p><p> if (M.mu!=N.mu||M.nu!=N.nu)/*判斷做減法運算的條件*/</p><p><b> {</b></p><p> printf ("不符合條件\n");</p><p> printf("請輸入符合條件的矩陣B:");&
54、lt;/p><p> CreateSMatrix(&N);</p><p><b> }</b></p><p><b> k=1;</b></p><p> (*Q).mu=M.mu;</p><p> (*Q).nu=N.nu;/*對結果矩陣的初始化*
55、/</p><p> for (i=1,j=1;i<=M.tu||j<=N.tu;)</p><p><b> {</b></p><p> if ((M.data[i].i==N.data[j].i)&&(M.data[i].j==N.data[j].j))</p><p><b
56、> {</b></p><p> (*Q).data[k].e=M.data[i].e-N.data[j].e;</p><p> (*Q).data[k].i=M.data[i].i;</p><p> (*Q).data[k].j=M.data[i].j;</p><p><b> i++;</
57、b></p><p><b> j++;</b></p><p><b> k++;</b></p><p><b> }</b></p><p> if ((M.data[i].i==N.data[j].i)&&(M.data[i].j<N
58、.data[j].j)||(M.data[i].i<N.data[j].i))</p><p><b> {</b></p><p> if (M.data[i].i>0)</p><p><b> {</b></p><p> (*Q).data[k].e=M.data[i].
59、e;</p><p> (*Q).data[k].i=M.data[i].i;</p><p> (*Q).data[k].j=M.data[i].j;</p><p><b> k++;</b></p><p><b> i++;</b></p><p><b
60、> }</b></p><p><b> else</b></p><p><b> {</b></p><p> (*Q).data[k].e=-N.data[j].e;</p><p> (*Q).data[k].i=N.data[j].i;</p>&
61、lt;p> (*Q).data[k].j=N.data[j].j;</p><p><b> k++;</b></p><p><b> j++;</b></p><p><b> }</b></p><p><b> }</b></
62、p><p> if ((M.data[i].i==N.data[j].i)&&(M.data[i].j>N.data[j].j)||(M.data[i].i>N.data[j].i))</p><p><b> {</b></p><p> if (N.data[i].i>0)</p><
63、p><b> {</b></p><p> (*Q).data[k].e=-N.data[j].e;</p><p> (*Q).data[k].i=N.data[j].i;</p><p> (*Q).data[k].j=N.data[j].j;</p><p><b> j++;</b
64、></p><p><b> k++;</b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> (*Q).data[k].e=
65、M.data[j].e;</p><p> (*Q).data[k].i=M.data[j].i;</p><p> (*Q).data[k].j=M.data[j].j;</p><p><b> k++;</b></p><p><b> i++;</b></p><
66、p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> (*Q).tu=k-1;</p><p> printf ("兩矩陣相減: \n") ;</p><p
67、> return OK;</p><p><b> }</b></p><p><b> 功能模塊詳細設計</b></p><p><b> ?。ㄏ∈杈仃嚨某朔ǎ?lt;/b></p><p><b> 5.1設計流程</b></p>
68、<p> 對于M中的每一個非零元素,找到N中所有滿足條件的元素,求的兩者的乘積,而乘積矩陣Q中的每一個元素的值是個累計和,這個乘積這只是其中的一部分,為便于操作,應對每一個元素設一累計和的變量,其初值為零,然后掃描數組M,求的相應元素的乘積并累加到適當的求累計和的變量上,由于Q中元素的行號和M眾元素的行號一致,又M中元素排列是以M德行序為主序的,由此可對Q進行逐行處理,先求得累計求和的中間結果(Q的一行),然后再壓縮存儲到
69、Q.data中去</p><p><b> 5.2主要源代碼</b></p><p> int MultSMatrix (RLSMatrix M,RLSMatrix N,RLSMatrix *Q)</p><p><b> {</b></p><p> int arow,brow,p,q,c
70、col,ctemp[maxrc+1];</p><p> if (M.nu!=N.mu) //矩陣M的列數應和矩陣N的行數相等</p><p><b> {</b></p><p> printf ("不符合做乘法的條件\n");</p><p> printf("請重新輸入稀疏矩陣
71、B:\n");</p><p> CreateSMatrix(&N);</p><p><b> }</b></p><p> (*Q).mu=M.mu; /* Q初始化*/</p><p> (*Q).nu=N.nu;</p><p> (*Q).tu=0;</
72、p><p> if (M.tu*N.tu!=0) /* M和N都是非零矩陣*/</p><p><b> {</b></p><p> for (arow=1;arow<=M.mu;++arow)/* 從M的第一行開始,到最后一行,arow是M的當前行*/</p><p><b> {</b
73、></p><p> for (ccol=1;ccol<=(*Q).nu;++ccol)</p><p> ctemp[ccol]=0; /* Q的當前行的各列元素累加器清零*/</p><p> (*Q).rpos[arow]=(*Q).tu+1; /* Q當前行的第個元素位于上行最后個元素之后*/</p><p> f
74、or (p=M.rpos[arow];p<M.rpos[arow+1];++p)</p><p> { /* 對M當前行中每一個非零元*/</p><p> brow=M.data[p].j; /* 找到對應元在N中的行號(M當前元的列號) */</p><p> for (q=N.rpos[brow];q<N.rpos[brow+1];++q)&
75、lt;/p><p><b> {</b></p><p> ccol=N.data[q].j; /* 乘積元素在Q中列號*/</p><p> ctemp[ccol]+=M.data[p].e*N.data[q].e;</p><p><b> }</b></p><p>
76、; } /* 求得Q中第arow行的非零元*/</p><p> for (ccol=1;ccol<=(*Q).nu;++ccol) /* 壓縮存儲該行非零元*/</p><p> if (ctemp[ccol])</p><p><b> {</b></p><p> if (++(*Q).tu>
77、maxsize)</p><p> return ERROR;</p><p> (*Q).data[(*Q).tu].i=arow;</p><p> (*Q).data[(*Q).tu].j=ccol;</p><p> (*Q).data[(*Q).tu].e=ctemp[ccol];</p><p>&
78、lt;b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> printf ("兩矩陣相乘: \n");</p><p> return OK;</p><p><b
79、> }</b></p><p><b> 功能模塊詳細設計</b></p><p><b> ?。ㄏ∈杈仃嚽竽妫?lt;/b></p><p><b> 6.1設計流程</b></p><p> 采用數組結構表示稀疏矩陣,通過判斷行列式的值是否為零,得出該矩
80、陣是否存在逆矩陣。若存在逆矩陣,則執(zhí)行以下操作:調用 N1Matrix()函數,得出該矩陣的伴隨矩陣,從而得出該稀疏矩陣的逆矩陣。</p><p><b> 6.2主要源代碼</b></p><p> //JsMatrix()函數用于計算行列式,通過遞歸算法實現 </p><p> int JsMatrix(int s[maxrc][m
81、axrc],int n) </p><p> { int z,j,k,r,total=0; </p><p> int b[maxrc][maxrc];//b[N][N]用于存放,在矩陣s[N][N]中元素s[0]的余子式 </p><p><b> if (n>2)</b></p><p>
82、 { for (z=0;z<n;z++)</p><p><b> {</b></p><p> for (j=0;j<n-1;j++)</p><p> for (k=0,r=0;k<n-1&&r<n;k++,r++)</p><p><b> {</
83、b></p><p><b> if (k!=z)</b></p><p> b[j][k]=s[j+1][r];</p><p><b> else</b></p><p><b> {</b></p><p> b[j][k]=s[j
84、+1][r+1];</p><p><b> r++;</b></p><p><b> }</b></p><p><b> }</b></p><p> if (z%2==0) r=s[0][z]*JsMatrix(b,n-1); /*遞歸調用*/ <
85、/p><p> else r=(-1)*s[0][z]*JsMatrix(b,n-1); </p><p> total=total+r;</p><p><b> }</b></p><p><b> } </b></p><p> if (n==2) t
86、otal=s[0][0]*s[1][1]-s[0][1]*s[1][0];</p><p> if (n==1) total=s[0][0]; </p><p> return total; </p><p><b> } </b></p><p> //N1Matrix()函數用于求原矩陣各元
87、素對應的余子式,存放在數組b[n][n]中,定義為float型 </p><p> void N1Matrix(int s[maxrc][maxrc],float b[maxrc][maxrc],int n) </p><p><b> {</b></p><p> int i,j,k,l,m,g,a[maxrc]
88、[maxrc];</p><p> for (i=0;i<n;i++)//z為行變量</p><p><b> {</b></p><p> for (j=0;j<n;j++)//j為列變量</p><p><b> {</b></p><p>
89、 for (k=0,l=i;k<n-1&&l<n;k++,l++)</p><p> for (g=0,m=j;g<n-1&&m<n;g++,m++)</p><p><b> {</b></p><p> if (g>=m&&k<l) a[k][g]=
90、s[k][g+1];</p><p> else if (k>=l&&g<m) a[k][g]=s[k+1][g]; </p><p> else if (k>=l&&g>=m) a[k][g]=s[k+1][g+1]; </p><p> else a[k][g]=s[k][g];<
91、/p><p><b> }</b></p><p> b[i][j]=JsMatrix(a,n-1);</p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></
92、p><p><b> //矩陣求逆</b></p><p> void NiMatrix(RLSMatrix &TM)</p><p> { int i,j,n,k; </p><p><b> n=TM.mu;</b></p><p> float temp;
93、//交換時臨時所需的變量</p><p> int a[maxrc][maxrc];</p><p> float b[maxrc][maxrc],c[maxrc][maxrc]; //b[][]用來存儲原矩陣的伴隨矩陣,c[][]用來存儲原矩陣的逆矩陣</p><p> for(i=0;i<n;i++) </p><p&
94、gt; for(j=0;j<n;j++)</p><p> a[i][j]=0;</p><p> for(i=1;i<=TM.tu;i++)</p><p> a[TM.data[i].i-1][TM.data[i].j-1]=TM.data[i].e;</p><p> k=JsMatrix(a,n);//k為
95、矩陣對應行列式的值</p><p> printf ("矩陣的行列式的值為:|A|=%d",k);</p><p><b> if(k==0)</b></p><p> printf ("行列式的值|A|=0,原矩陣無逆矩陣!!"); </p><p><b>
96、 else</b></p><p><b> {</b></p><p> N1Matrix(a,b,n);</p><p> //調用N1Matrix()函數,得到原矩陣各元素對應的余子式的值,存放在數組b[n][n]中 </p><p> for(i=0;i<n;i++) //求代
97、數余子式,此時b[n][n]中存放的為原矩陣各元素對應的"代數余子式" </p><p> for(j=0;j<n;j++) </p><p> if((i+j)%2!=0 && b[i][j]!=0) b[i][j]=-b[i][j]; </p><p> for(i=0;i<n;i++)
98、//對b[N][N]轉置,此時b[n][n]中存放的為原矩陣的伴隨矩陣 </p><p> for(j=i+1;j<n;j++) </p><p> {temp=b[i][j]; </p><p> b[i][j]=b[j][i]; </p><p> b[j][i]=temp; </p>
99、<p><b> } </b></p><p> printf ("伴隨矩陣為\n");</p><p> for (i=0;i<n;i++)</p><p><b> {</b></p><p> for (j=0;j<n;j++)
100、</p><p><b> {</b></p><p> printf ("%f ",b[i][j]);</p><p><b> }</b></p><p> printf ("\n");</p><p><b>
101、 }</b></p><p> for(i=0;i<n;i++) //求逆矩陣,此時c[n][n]中存放的是原矩陣的逆矩陣 </p><p><b> {</b></p><p> for(j=0;j<n;j++) </p><p><b> {</b>
102、</p><p> c[i][j]=b[i][j]/k;</p><p><b> }</b></p><p> printf ("逆矩陣為\n");</p><p><b> }</b></p><p> for (i=0;i<n;i++
103、)</p><p><b> {</b></p><p> for (j=0;j<n;j++)</p><p><b> {</b></p><p> printf ("%f",c[i][j]);</p><p><b> }&l
104、t;/b></p><p> printf ("\n");</p><p><b> }</b></p><p><b> } </b></p><p><b> } </b></p><p> 7 總程序及
105、運行結果</p><p><b> 7.1 程序</b></p><p> #include<stdio.h></p><p> #include<math.h></p><p> #define maxsize 100/* 原稀疏矩陣中非零元個數的最大值*/</p>
106、<p> #define maxrc 100/* 最大階(行)數*/</p><p> #define OK 1</p><p> #define ERROR 0</p><p> typedef struct/*定義非零元的三元組*/</p><p><b> {</b></p&
107、gt;<p> int i,j; /* 行下標,列下標*/</p><p> int e; /* 非零元素值*/</p><p><b> }Triple; </b></p><p> typedef struct/*定義稀疏矩陣的結構體*/</p><p><b> {</
108、b></p><p> Triple data[maxsize+1]; /* 非零元三元組表,data[0]未用*/</p><p> int rpos[maxrc+1]; /* 各行第一個非零元素的位置表*/</p><p> int mu,nu,tu; /* 矩陣的行數、列數和非零元個數*/</p><p> }RLSMat
109、rix;</p><p> //、-創(chuàng)建矩陣、//</p><p> int CreateSMatrix (RLSMatrix *M)/* 創(chuàng)建稀疏矩陣M */</p><p><b> {</b></p><p> int i,j,k,p;</p><p><b> Tr
110、iple T;</b></p><p> printf ("請輸入矩陣的行數,列數,非零元素數:");</p><p> scanf("%d,%d,%d",&(*M).mu,&(*M).nu,&(*M).tu);</p><p> for (i=1;i<=(*M).tu;i++)
111、</p><p><b> {</b></p><p><b> do</b></p><p><b> {</b></p><p> printf ("請按行序為主序輸入第%d個非零元素所在的行(1~%d),列(1~%d),元素值:",i,(*M)
112、.mu,(*M).nu);</p><p> scanf ("%d,%d,%d",&T.i,&T.j,&T.e);</p><p> if (T.i>(*M).mu||T.i<0||T.j>(*M).nu||T.j<0)</p><p> printf ("不符合條件,請重新輸入\n
113、");</p><p><b> k=0;</b></p><p> if (T.i<1||T.i>(*M).mu||T.j<1||T.j>(*M).nu) /* 行、列超出范圍*/</p><p><b> k=1;</b></p><p> if (T.
114、i<(*M).data[i-1].i||T.i==(*M).data[i-1].i&&T.j<=(*M).data[i-1].j) /* 沒有按順序輸入非零元素*/</p><p><b> k=1;</b></p><p> }while (k); /* 當輸入有誤,重新輸入*/</p><p> (*M).
115、data[i]=T;</p><p><b> }</b></p><p><b> p=1;</b></p><p> (*M).rpos[1]=1;</p><p> for (i=1;i<=(*M).mu;i++) /* 計算rpos[] */</p><p&
116、gt;<b> {</b></p><p><b> k=0;</b></p><p> for (j=1;j<(*M).nu;j++)</p><p><b> {</b></p><p> if ((*M).data[p].i==i)</p>
117、<p><b> {</b></p><p><b> k++;</b></p><p><b> p++;</b></p><p><b> }</b></p><p> else if ((*M).data[p].i!=i) b
118、reak;</p><p><b> }</b></p><p> (*M).rpos[i+1]=(*M).rpos[i]+k;</p><p><b> }</b></p><p> return OK;</p><p><b> }</b>
119、</p><p> //、-輸出矩陣、//</p><p> void PrintSMatrix (RLSMatrix M)/* 以陣列式輸出稀疏矩陣M */</p><p><b> {</b></p><p> int i,j,k;</p><p><b> k=1;
120、</b></p><p> for (i=1;i<=M.mu;i++)</p><p><b> {</b></p><p> for (j=1;j<=M.nu;j++)</p><p><b> {</b></p><p> if ((M.
121、data[k].i==i)&&(M.data[k].j==j))</p><p><b> {</b></p><p> printf ("%d ",M.data[k].e);</p><p><b> k++;</b></p><p><b>
122、 }</b></p><p><b> else</b></p><p> printf ("0 ");</p><p><b> }</b></p><p> printf ("\n");</p><p><
123、b> }</b></p><p><b> }</b></p><p> //、-矩陣加法、//</p><p> int Add (RLSMatrix M,RLSMatrix N,RLSMatrix *Q)</p><p><b> {</b></p>&
124、lt;p> int i,j,k;</p><p> if (M.mu!=N.mu||M.nu!=N.nu)/*判斷做加法運算的條件*/</p><p><b> {</b></p><p> printf ("不符合條件\n");</p><p> printf("重新輸
125、入一個符合條件的矩陣B:");</p><p> CreateSMatrix(&N);</p><p><b> }</b></p><p><b> k=1;</b></p><p> (*Q).mu=M.mu;</p><p> (*Q).nu
126、=M.nu;</p><p> (*Q).tu=0;/*對結果矩陣的初始化*/</p><p> for (i=1,j=1;i<=M.tu||j<=N.tu;)</p><p><b> {</b></p><p> if ((M.data[i].i==N.data[j].i)&&am
127、p;(M.data[i].j==N.data[j].j))</p><p><b> {</b></p><p> (*Q).data[k].e=M.data[i].e+N.data[j].e;</p><p> (*Q).data[k].i=M.data[i].i;</p><p> (*Q).data[k].
128、j=M.data[i].j;</p><p><b> i++;</b></p><p><b> j++;</b></p><p><b> k++;</b></p><p><b> }</b></p><p> if
129、 ((M.data[i].i==N.data[j].i)&&(M.data[i].j<N.data[j].j)||(M.data[i].i<N.data[j].i))</p><p><b> {</b></p><p> if (M.data[i].i>0)</p><p><b> {<
130、;/b></p><p> (*Q).data[k].e=M.data[i].e;</p><p> (*Q).data[k].i=M.data[i].i;</p><p> (*Q).data[k].j=M.data[i].j;</p><p><b> k++;</b></p><p
131、><b> i++;</b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> (*Q).data[k].e=N.data[j].e;</p>
132、;<p> (*Q).data[k].i=N.data[j].i;</p><p> (*Q).data[k].j=N.data[j].j;</p><p><b> k++;</b></p><p><b> j++;</b></p><p><b> }<
133、/b></p><p><b> }</b></p><p> if ((M.data[i].i==N.data[j].i)&&(M.data[i].j>N.data[j].j)||(M.data[i].i>N.data[j].i))</p><p><b> {</b></p
134、><p> if (N.data[i].i>0)</p><p><b> {</b></p><p> (*Q).data[k].e=N.data[j].e;</p><p> (*Q).data[k].i=N.data[j].i;</p><p> (*Q).data[k].j=N
135、.data[j].j;</p><p><b> j++;</b></p><p><b> k++;</b></p><p><b> }</b></p><p><b> else</b></p><p><b&g
136、t; {</b></p><p> (*Q).data[k].e=M.data[j].e;</p><p> (*Q).data[k].i=M.data[j].i;</p><p> (*Q).data[k].j=M.data[j].j;</p><p><b> k++;</b></p>
137、;<p><b> i++;</b></p><p><b> }</b></p><p><b> }</b></p><p><b> }</b></p><p> (*Q).tu=k-1;</p><p&g
138、t; printf ("兩矩陣相加: \n") ;</p><p> return OK;</p><p><b> }</b></p><p> //、-矩陣減法、//</p><p> int subtraction (RLSMatrix M,RLSMatrix N,RLSMatrix
139、*Q)</p><p><b> {</b></p><p> int i,j,k;</p><p> if (M.mu!=N.mu||M.nu!=N.nu)/*判斷做減法運算的條件*/</p><p><b> {</b></p><p> printf (&
140、quot;不符合條件\n");</p><p> printf("請輸入符合條件的矩陣B:");</p><p> CreateSMatrix(&N);</p><p><b> }</b></p><p><b> k=1;</b></p>
141、<p> (*Q).mu=M.mu;</p><p> (*Q).nu=N.nu;/*對結果矩陣的初始化*/</p><p> for (i=1,j=1;i<=M.tu||j<=N.tu;)</p><p><b> {</b></p><p> if ((M.data[i].i
142、==N.data[j].i)&&(M.data[i].j==N.data[j].j))</p><p><b> {</b></p><p> (*Q).data[k].e=M.data[i].e-N.data[j].e;</p><p> (*Q).data[k].i=M.data[i].i;</p>&l
143、t;p> (*Q).data[k].j=M.data[i].j;</p><p><b> i++;</b></p><p><b> j++;</b></p><p><b> k++;</b></p><p><b> }</b><
144、;/p><p> if ((M.data[i].i==N.data[j].i)&&(M.data[i].j<N.data[j].j)||(M.data[i].i<N.data[j].i))</p><p><b> {</b></p><p> if (M.data[i].i>0)</p>&l
145、t;p><b> {</b></p><p> (*Q).data[k].e=M.data[i].e;</p><p> (*Q).data[k].i=M.data[i].i;</p><p> (*Q).data[k].j=M.data[i].j;</p><p><b> k++;</
146、b></p><p><b> i++;</b></p><p><b> }</b></p><p><b> else</b></p><p><b> {</b></p><p> (*Q).data[k].e
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 《數據結構》課程設計報告--稀疏矩陣運算器
- 數據結構課程設計報告--稀疏矩陣運算器
- 數據結構課程設計報告 稀疏矩陣運算器
- 數據結構課程設計--基本稀疏矩陣運算的運算器
- 數據結構課程設計報告 稀疏矩陣運算器設計
- 課程設計---稀疏矩陣加法運算器
- 數據結構課程設計-- 稀疏矩陣的運算
- 數據結構--稀疏矩陣課程設計
- 數據結構課程設計---稀疏矩陣
- 數據結構與課程設計---稀疏矩陣
- 數據結構課程設計--稀疏矩陣的操作
- 數據結構課程設計-稀疏矩陣實現與應用
- 課程設計--設計一個矩陣運算器
- 數據結構課程設計論文----稀疏矩陣的轉置
- 稀疏矩陣的轉置論文-數據結構課程設計論文
- 稀疏矩陣的運算課程設計
- 稀疏矩陣的運算課程設計
- 數據結構課程設計--矩陣的加、減、乘法運算的實現
- 數電課程設計報告---運算器
- 數據結構課程設計報告-長整數運算
評論
0/150
提交評論