资源描述:
《数据结构课程设计-稀疏矩阵运算器》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、实习4.稀疏矩阵运算器一、需求分析1•问题描述稀疏矩阵是指那些多数元素为零的矩阵。利用“稀疏〃特点进行存储和计算可以大大节省存储空间,提高计算效率。实现一个能进行稀疏矩阵基本运算的运算器。2.基本要求以带"行逻辑连接信息〃的三元组顺序表表示稀疏矩阵,实现两个矩阵的相加、相减和相乘运算。稀疏矩阵的输入形式采用三元组表示,而运算结果的矩阵则以通常的阵列形式列出。3.实现提示(1)首先应输入矩阵的行数和列数,并判别给出的两个矩阵的行、列数对于所要求作的运算是否匹配。可设聚矩阵的行数和列数不超过20。⑵程序可以対三元组的输入顺序加以限制,例如
2、,按行优先。注意研究教科书5.3.2节中的算法,以便提高计算效率。(3)在用三元组表示稀疏矩阵时,相加或相减所得的结果矩阵应该另生成,乘积矩阵也可以用二维数组存放。二、概要设计ADTSparseMatrix{数据对象:D={ajj
3、i=l,2,3m;j=1,2,3nQjWintSet,m和n分别称为矩阵的行数和列数}数据关系:R二{Row,col}Rowjj+i>Col11WiWm-1,2WjWn}基本操作:CreateSMatrix(*T);操作结果:创建稀疏矩阵T。AddRLSMatrix(M,N,*Q);初始条件:稀疏矩阵M和N
4、的行数列数对应相等。操作结果:求稀疏矩阵的和Q=M+NoSubRLSSMatrix(M,N,*Q);初始条件:稀疏矩阵M和N的行数列数对应相等。操作结果:求稀疏矩阵的差Q=M-NoSMatrixrpos(*T)初始条件:稀疏矩阵T存在。操作结果:求稀疏矩阵的各行第一个非零元的位置表。MuITSMatrix(M,N,*Q);初始条件:稀疏矩阵M的列数与N的行数对应相等。操作结果:求稀疏矩阵的乘积Q=M*N;PrintSMatrix(RLSMatrixQ)初始条件:稀疏矩阵Q存在。操作结杲:输出稀疏矩阵Q。DestorySMatrix(T
5、);初始条件:稀疏矩阵T存在。操作结果:销毁稀疏矩阵T。}ADTSparseMatrix三、详细设计(源代码)(使用C语言)stdio.h>#ilib.h>#defineMAXSIZE400〃矩阵非零元个数的最大值为400#defineMAXRC20〃矩阵的行数(列数)的最大值为20typedefstruct{//稀疏矩阵的三元组顺序表存储表示inti,j;〃该非零元的行下标和列下标inte;JTriple;typedefstruct{Tripledata[MAXSIZE+l];〃非零元三元组表,data[0]未用intrposJMA
6、XRC+1];//各行第一个非零元的位置表intmu,nu,tu;〃矩阵的行数列数和非零元的个数JRLSMatrix;voidCreatesMatrix(RLSMatrix*T){〃输入并创建稀疏矩阵intk;printfC请输入矩阵行数、列数及非零元个数:”);scanf("%d%T->tu);printf(uH);if(T->tu>MAXSIZE
7、
8、T->mu>20
9、
10、T->nu>20){printfCLBIS:非零个数或行数(列数)超出定义范围!”);exit(O);}fT->tu;k++){printfC请输入第%
11、个非零元素的行数,列数及其值:”,k);scanf(M%d%d%dMT->data[k].e);intAddRLSMatrix(RLSMatrixM.RLSMatrixN,RLSMatrix*Q){//稀疏矩阵的加法运算,运算失败返回0intp,q,k=O;if(M.mu!=N.mu
12、
13、M.nu!=N.nu)//传入的稀疏矩阵不符合加法运算条件return0;Q->mu=M.mu;Q->nu=M.nu;k++;for(p=l,q=l;{if(M.data[p].i==N.data[q].i){if(M.data[p].j==N.dat
14、a[q].j)//非零元的相加{Q->data[k].i=M.data[p].i;Q->data[k].j=M.data[p]j;Q->data[kJ.e=M.data[pJ.e+N.data[q].e;p++;q++;k++;}//非零元与零元的相加elseif(M.datata[q].j){Q->data[k].i=M.data[p].i;Q->data[k].j=M.data[p].j;Q->data[k].e=M.data[p].e;k++;p++;}elseif(M.datafp].j>N.data[q].j){Q->dat
15、a[k].i=N.data[q].i;Q->data[k].j=N.data[q]j;Q->data[kJ.e=N.data[q].e;k++;p++;}}elseif(M.data[p].i.i){Q->data[k]