2023年实现稀疏矩阵采用三元组表示的基本运算实验报告.docx
实现稀疏矩阵(采用三元组表达)的基本运算实验报告一实验题目: 实现稀疏矩阵(采用三元组表达)的基本运算二实验规定:(1)生成如下两个稀疏矩阵的三元组a和b;(上机实验指导P92 )(2)输出a转置矩阵的三元组;(3)输出a + b的三元组;(4)输出a * b的三元组;三实验内容:3. 1稀疏矩阵的抽象数据类型:A DT S pars e M a trix 数据对象:D= aij| i =2, 3, n;a i J£E1 e mS e l,m和n分别称为矩阵的行数和 列数数据关系:R= Row , Col )Row =<ai,j ,aij +1> | iWiWm, lWjW n -1)Col=<ai, j , a i + 1 ,j >| 1 W i Wm-l, 1 WjWn 基本操作:Cr e a t cSMatrix(&M)操作结果:创建稀疏矩阵MPrintSMatrix (M)v =a. d atai. d+ b . dataj. d;。oi f (v!=0)/只将不为0的结果添加到c中8ooc. d ata k . r=a. d a tai. r;a>c. d a tak. c=a. datai. c ;gg c. da t ak. d=v;«>k+;6031+; j+;)e 1 s e if ( a . da t ai. r< b , da t a j. r) /a 元素的 行号小于b元素的行号。 (c. da t a k . r=a. dat a i. r 将 a 元素添加到 c中g c . data k. c =a. dat a i. c;«>c. d a t a k. d =a. dat a i. d;ok+; i +;)oc 1 se 600oc 1 se 600/ /a元素的行号大于b元素的行号。c. d atak. r= b . data j . r;/ /将 b 元素添加到 c 中。 c. d at a k . c =b. d a t a j. c;3C. datak. d= b . da t aj . d ;。k+; j+;)c. n u ms=k;)return true;int getv a lu e (T S Matrix c,int i , int j)(int k =0;wh i le (k<c. num s && (c. da t ak. r! = i I | c. da t ak. c!=J )g k + + ;if (k<c. nums)ret u rn ( c . d at a k. d);elseoreturn(O);bool MatMul (TSMat r ix a, TSMatrix b, TSMatrix & c )i n t i, j, k, p=0;El e mT y p e s ;if ( a . c o 1 s!=b. rows) “/a的列数不等于b的行数时不能进行相乘运算return f als e ;for ( i =0;i<a. r ows;i+)for (j=0; j <b. col s ; j+)。(s= 0 ;for ( k =0;k<a. co 1 s;k+ + )o®s= s +g e tvalu e (a, i, k)*g e tvalue(b, k,j);if ( s !=0)/产生一个三元组元素c . d atap. r=i;c. da t a p . c = j ;c . datap. d= s ;p+;c. rows=a. r ows;oc. c o 1 s =b. c ols;oc. n u m s =p;ret u rn true;int main ()(E 1 emTy pe alNN = 10, 3,0),0, 1,0,0),(0,0, 1,0, 0 , 0, 1, 1);6ElemType bl N N =3, 0, 0,0,0, 4, 0,0,0,0, 1,0,0,0,0, 2);oTSMatrix a , b, c;sCreatMat (a, a 1 ) ; Great Mat ( b , b 1 ); opri n tf ( " a 的三元组:n); DispMa t (a);呼 r intf ( " b 的三元组: n );D i spMat (b); op r i ntf (" a转置为 c n");Tr a nMat (a, c);叩 r i n tf (,zc 的三元组:n);D i spMa t (c);oprintf (c=a+b n);M a tA d d (a, b, c);p r i ntf ( c 的三元组: n);DispMa t (c);o p ri n t f ( " c=a X b n);MatMul ( a , b, c);opr i n tf ("c 的三元组:n ");Di s pMa t ( c );r e tur n 0;四实验结果(T D:C2014.1212.12test.exea的三元组: 40 0 12 33 b的三元组:4131111401234专置为cc的三元组:434120 12223 c=a+b c的三元组:41131110 12 3 3435213c=aXbc的三元组:446032341 112 2Process 工eturned 0 (0x0) execution time : 0.017 s Press any key to continue.初始条件:稀疏矩阵M已经存在操作结果:打印矩阵MDestroySMatr i x(&M)初始条件:稀疏矩阵M已经存在操作结果:销毁矩阵MCopySMat r ix(M, &T)初始条件:稀疏矩阵M已经存在操作结果:复制矩阵M到TAddSMatri x (M, N , &Q)初始条件:稀疏矩阵M、N已经存在操作结果:求矩阵的和Q=M + NS ub S Matr i x (M, N, &Q)初始条件:稀疏矩阵M、N已经存在操作结果:求矩阵的差Q=M-NTr a n s poseSMatr i x(M, & T)初始条件:稀疏矩阵M已经存在操作结果:求矩阵M的转置TMui t SMatrix(M, N, &Q)初始条件:稀疏矩阵M己经存在操作结果:求矩阵的积Q=M*N)ADT SparscM a tri x32存储结构的定义# define N 4type def int ElemT y p e ;# d e fi n e MaxSize# d e fi n e MaxSize1 0 0”/矩阵中非零元素最多个数typedef struct int r;int c;E 1 e mType d; TupN o de;t y pe d e f structint rows;int cols;int n u ms ;。/行号/列号“/元素值/三元组定义。/行数值。/列数值。非零元素个数T u pNode d ataMaxS i ze;TSMatr i x ;/三元组顺序表定义3. 3基本操作实现:v o i d CreatM a t (TSMatr i x & t , E1 emT y pe ANN)int i, j ;t. r o w s=N; t. col s =N; t . n ums=0;f or (i=0; i <N; i+)f or (j=0; j<N; j+)if (A i j !=0) (。t . data t. nums. r=i; t. data t. n u m s . c=j;8t. d a t a t. num s . d=Ai j ;t. nums+ ;000;0 voi d D i s pM a t ( TSMatri x t) (int i;if ( t . n u ms<=0)®®re t urn;叩rint f ( t /dt%dt%dn,t. r o ws, t. c ols, t. n urns);p rin t f (tn);for (i =0; i<t. num s ; i+)printf (z/t%dt% d t% d n,t. dat a i . r , t . d at a i. c , t. d a ta i. d);)3.4 解题思绪:1 .转置矩阵:只要鉴定原矩阵有值,那么只要遍历一遍原矩阵,把本来 矩阵中非0元素行列变换一下赋值到新的矩阵中即可。2 .矩阵加法:用各种if判断,区分出矩阵进行加法时的也许情况,分 情况解决即可。3 .矩阵乘法:通过get v al u e (c , i, j) 函数查找 矩阵c 中i行j歹U,所储存的元素的值。然后便是模拟矩阵乘法的过程进行求 解。3.5 解题过程:实验源代码如下:3. 5.1顺序表的各种运算include <s t dio. h >#de f i ne N 4typedef int Ele mT y pe;# d efine Ma x Si z e 1 0 0/矩阵中非零元素最多个数ty p ede f s t rue toint r ;/行号/列号。/元素值 Tu p Node;三元组定义t y pedef struc tint r o w s ;行数值int col s ;,/列数值int nums;。/非零元素个数TupNode data Max S i ze; TSMatrix;/三元组顺序表定义void CreatMat (TSMatrix &t, E 1 e mType AN N ) n t i , j ;t. r o ws=N; t. col s =N ; t. nums = 0;for (i = 0 ; i<N ; i+)for (j=0 ;j<N; j + + )oi f (A i j! =0)8 t. d a t at. nums. r =i; t. datat. n ums. c =j;的 t . d a t at. n u ms. d=Ai j; t. nums + + ;。 d)voi d DispMa t (T SMatrix t) i n t i;i f (t. nums< = 0)。 ret u rn;pr i n tf ( n t%d t %d t%dn " , t. rows, t. cols, t . n u ms);pr i n t f (t n ");for (i= 0 ; i<t. n u ms; i + +)p r intf (z,t%d t %d t %d n,z, t. datai. r, t. da t ai . c, t. dat ai. d);)void T r anMat (TSM a t rix t, TSM a trix &tb) i nt p, q=0, v; 。/q 为 tb. d a ta 的下标tb. rows=t. c ols; tb. co 1 s =t. rows; t b. n u ms= t . n u ms;if (t. n u ms!= 0 )for ( v =0; v <t. cols;v + +)»/tb. d a t aq中的记录以 c 域的顺序排列。 of o r (p= 0 ;p<t. nums; p+) “/p 为 t. da t a 的下标。 oif (t. dataEp. c-v)0o (。tb. d a t a q. r=t. d ata p . c;。 8tb. data q. c=t. da t a p . r;gtb. da t a Eq. d=t. d a t ap. d;3 P + +;00)bo o 1 M a tAdd(TSMat r ix a, TSMa t rix b, TSM a trix &c)。i nt i=0, j = 0, k= 0 ;oE 1 e mTy p e v;if ( a . r o ws! = b . r o ws I | a . c o Is ! =b. c o 1 s)。 ret u rn f al s e;必行数或列数不等时不能进行相加运算c. row s =a. r ows;c. col s=a. c ols; c 的行列数与 a 的相同owh i 1 e (i<a. n ums && j<b. n um s ) / / 解决 a 和 b 中的每个元素if (a. d ata i. r =二b. d a ta j .r)。/行号相等时«« i f (a. d a ta i . c <b. dataj . c) / / a 元素的列号小于 b 元素的 列号8。<»c. d a t a k. r=a. datai. r ;/ 将 a 元素添加到 c 中。c. d atak. c=a. data i. c ;。c. da t a k . d =a. d ata i. d ;°k+; i+;0else i f ( a . datai. c>b. d a c)a 元素 的列号大于b元素的列号。(c . datak. r=b. d ataj . r ; 将 b 元素添加 至|J c中c . dat a Ek. c=b. dat a j . c;c. d ata k . d =b. data j. d ;k+;j + + ;oelse /a元素的列号等于b元素的列号