语言数据结构实验报告稀疏矩阵运算是的与实现.doc
更多课程设计、论文、毕业设计请访问:数据结构实验报告实验题目: 稀疏矩阵运算器问题描述:有输入界面(图形或文字界面都可),能区分加法和转置;能处理任意输入的典型数据和进行出错数据处理(例如加法,当第一个矩阵和第二个矩阵的行数和列数不相等时,不能运算);必须采用三元组作存储结构,不能采用数组等形式;输出要求用矩阵的形式输出(即习题集136页的形式)。实验目的:使用三元组实现稀疏矩阵的运算实验内容:写出程序并上机调试、通过。一、需求分析1、演示程序以用户和计算机的对话方式执行,即在计算机终端上显示*矩阵的加法和转制运算器*1、稀疏矩阵的加法2、稀疏矩阵的转置输入要进行的项目的编号: 时输入要进行的运算对应的数字。当出现“请输入矩阵的行数、列数和非零元个数(以空格隔开):”时输入矩阵的行数、列数和非零元素个数。当出现“请用三元组形式输入矩阵的元素(行 列 非零元素):”时输入矩阵中的所有非零元素的位置和值,这时将出现由输入的因素所生成的矩阵A。若在输入项目标号时输入的是1,接着会出现“请输入矩阵的行数、列数和非零元个数(以空格隔开):”,这时输入另一个矩阵的行数、列数和非零元素个数。当出现“请用三元组形式输入矩阵的元素(行 列 非零元素):”时输入另一个矩阵中的所有非零元素的位置和值。这时将会生成矩阵B和矩阵A+B若在输入项目标号时输入的是2,在出现矩阵A后会出现A的转置矩阵。3、程序的执行包括:(1)构造三元组顺序表存储非零元的位置和值;(2)输入要进行的项目的编号;(3)生成矩阵A;(4)输出矩阵A;(5)判断要进行的运算。若为1,生成矩阵B并输出矩阵B和矩阵A+B;若为2,输出矩阵;(6)销毁矩阵;(7)结束4、本实验做一个类似于运算器的程序,实现矩阵的转置和加法运算,5、输入及输出示例:*矩阵的加法和转制运算器*1、稀疏矩阵的加法2、稀疏矩阵的转置输入要进行的项目的编号: 1请输入矩阵的行数、列数和非零元个数(以空格隔开):5 5 2请用三元组形式输入矩阵的元素(行 列 非零元素):1 2 63 5 19矩阵A:0 6 0 0 00 0 0 0 00 0 0 0 190 0 0 0 00 0 0 0 0 请输入矩阵的行数、列数和非零元个数(以空格隔开):5 5 51 1 31 5 92 3 83 4 113 5 6 矩阵B:3 0 0 0 90 0 8 0 00 0 0 11 60 0 0 0 0 0 0 0 0 0 A+B:3 6 0 0 90 0 8 0 0 0 0 0 11 250 0 0 0 0 0 0 0 0 0二 概要设计1基本操作本程序中,用三元组顺序表作为存储结构。(1)、Creat(TSMatrix &M)操作结果:创建矩阵M。(2)、AddSMatrix(TSMatrix A,TSMatrix B,TSMatrix &C,int n)初始条件:矩阵A和B的行数和列数对应相等。操作结果:求矩阵A、B的和C=A+B。(3)、TransposeSMarix(TSMatrix *a,TSMatrix *b)初始条件:矩阵A、B已存在且a指向矩阵A,b指向矩阵B。操作结果:将a指向的矩阵转置到b指向的矩阵。(4)、Print_SMatrix(TSMatrix M)初始条件:矩阵M已存在操作结果:输出矩阵M2、模块调用图主程序模块创建三元组顺序表模块创建矩阵模块矩阵运算模块输出链表模块销毁矩阵模块三 详细设计1、每个模块:(1) 创建用于存储的三元组顺序表#define MAXSIZE 40 /假设非零元素个数的最大值为40 typedef int ElemType; typedef struct int i,j; /非零元的行下标和列下标 ElemType e; /非零元的值 Triple; typedef struct Triple dataMAXSIZE+1; int rposMAXRC+1; /各行第一个非零元在三元组的位置表 int hs,ls,fls; TSMatrix,*Matrix; (2)、创建矩阵void Creat(TSMatrix &M) int i,k; for(i=1;i<=MAXRC+1;i+) M.rposi=0; printf("请输入矩阵的行数、列数和非零元个数(以空格隔开):"); scanf("%d %d %d",&M.hs,&M.ls,&M.fls);/将得到的M矩阵的性质保存printf("请用三元组形式输入矩阵的元素(行 列 非零元素):n"); for(i=1;i<=M.fls;i+)scanf("%d %d %d",&M.datai.i,&M.datai.j,&M.datai.e);/将M中的非零元素记录,生成矩阵 for(i=1,k=1;i<=M.hs;i+) M.rposi=k; while(M.datak.i<=i && k<=M.fls)k+; (3)、矩阵的运算1)矩阵加法void AddSMatrix(TSMatrix A,TSMatrix B,TSMatrix &C,int n) int a,b,temp,l; C.hs=A.hs;C.ls=A.ls;a=b=l=1;while(a<=A.fls && b<=B.fls) if(A.dataa.i=B.datab.i) if(A.dataa.j<B.datab.j)C.datal+=A.dataa+; else if(A.dataa.j>B.datab.j)C.datal=B.datab; C.datal+.e=n*B.datab+.e;elsetemp=A.dataa.e+n*B.datab.e; if(temp)C.datal=A.dataa; C.datal.e=temp; l+; a+;b+; else if(A.dataa.i<B.datab.i)C.datal+=A.dataa+; else C.datal=B.datab; C.datal+.e=n*B.datab+.e; while(a<=A.fls)C.datal+=A.dataa+; while(b<=B.fls)C.datal=B.datab; C.datal+.e=n*B.datab+.e; C.fls=l-1; 2)矩阵转置void TransposeSMarix(TSMatrix *a,TSMatrix *b)int q,col,p;b->hs=a->ls;b->ls=a->hs;b->fls=a->fls;if(b->fls)q=1;for(col=1;col<=a->ls;col+) for(p=1;p<=a->fls;p+)if(a->datap.j=col)b->dataq.i=a->datap.j;b->dataq.j=a->datap.i;b->dataq.e=a->datap.e;+q;(4)、输出函数void Print_SMatrix(TSMatrix M) int k,l,n; Matrix p; p=&M; for(k=1,n=1;k<=p->hs;k+) for(l=1;l<=p->ls;l+) if(p->datan.i=k && p->datan.j=l) printf("%5d",p->datan.e); n+; else printf("%5d",0); printf("n"); printf("n"); (5)、销毁矩阵void Destory_SMatrix(TSMatrix &M) M.hs=M.ls=M.fls=0; (6)、主函数void main() TSMatrix A,B,C; TSMatrix *p=&A,*q=&B;int flag,n; printf("t *矩阵的加法和转制运算器* n");printf("t 1、稀疏矩阵的加法 n");printf("t 2、稀疏矩阵的转置 n");printf("输入要进行的项目的编号:"); scanf("%d",&flag); Creat(A); printf("矩阵A:n"); Print_SMatrix(A); switch(flag) case 1:Creat(B);n=1;printf("矩阵B:n"); Print_SMatrix(B); if(A.hs=B.hs && A.ls=B.ls) printf("A+B:n"); AddSMatrix(A,B,C,n);Print_SMatrix(C); else printf("错误!行列不一致n"); break; case 2: printf("A->B:n"); TransposeSMarix(p,q); Print_SMatrix(B);break; default:printf("输入错误!n"); Destory_SMatrix(A); Destory_SMatrix(B);Destory_SMatrix(C); 2、完整函数#include<stdio.h> #include<malloc.h> #include<stdlib.h> #define MAXSIZE 40 /假设非零元素个数的最大值为40 #define MAXRC 20/假设矩阵的最大行数为20 typedef int ElemType; typedef struct int i,j; /非零元的行下标和列下标 ElemType e; /非零元的值 Triple; typedef struct Triple dataMAXSIZE+1; int rposMAXRC+1; /各行第一个非零元在三元组的位置表 int hs,ls,fls; TSMatrix,*Matrix; void Creat(TSMatrix &M)/创建矩阵 int i,k; for(i=1;i<=MAXRC+1;i+) M.rposi=0; printf("请输入矩阵的行数、列数和非零元个数(以空格隔开):"); scanf("%d %d %d",&M.hs,&M.ls,&M.fls);/将得到的M矩阵的性质保存printf("请用三元组形式输入矩阵的元素(行 列 非零元素):n"); for(i=1;i<=M.fls;i+)scanf("%d %d %d",&M.datai.i,&M.datai.j,&M.datai.e);/将M中的非零元素记录,生成矩阵 for(i=1,k=1;i<=M.hs;i+) M.rposi=k; while(M.datak.i<=i && k<=M.fls)k+; void AddSMatrix(TSMatrix A,TSMatrix B,TSMatrix &C,int n)/矩阵相加 int a,b,temp,l; C.hs=A.hs;C.ls=A.ls;a=b=l=1;while(a<=A.fls && b<=B.fls) if(A.dataa.i=B.datab.i) if(A.dataa.j<B.datab.j)C.datal+=A.dataa+; else if(A.dataa.j>B.datab.j)C.datal=B.datab; C.datal+.e=n*B.datab+.e;elsetemp=A.dataa.e+n*B.datab.e; if(temp)C.datal=A.dataa; C.datal.e=temp; l+; a+;b+; else if(A.dataa.i<B.datab.i)C.datal+=A.dataa+; else C.datal=B.datab; C.datal+.e=n*B.datab+.e; while(a<=A.fls)C.datal+=A.dataa+; while(b<=B.fls)C.datal=B.datab; C.datal+.e=n*B.datab+.e; C.fls=l-1; void TransposeSMarix(TSMatrix *a,TSMatrix *b)/矩阵转制int q,col,p;b->hs=a->ls;b->ls=a->hs;b->fls=a->fls;if(b->fls)q=1;for(col=1;col<=a->ls;col+) for(p=1;p<=a->fls;p+)if(a->datap.j=col)b->dataq.i=a->datap.j;b->dataq.j=a->datap.i;b->dataq.e=a->datap.e;+q;void Print_SMatrix(TSMatrix M)/输出函数 int k,l,n; Matrix p; p=&M; for(k=1,n=1;k<=p->hs;k+) for(l=1;l<=p->ls;l+) if(p->datan.i=k && p->datan.j=l) printf("%5d",p->datan.e); n+; else printf("%5d",0); printf("n"); printf("n"); void Destory_SMatrix(TSMatrix &M)/销毁矩阵 M.hs=M.ls=M.fls=0; void main() TSMatrix A,B,C; TSMatrix *p=&A,*q=&B;int flag,n; printf("t *矩阵的加法和转制运算器* n");printf("t 1、稀疏矩阵的加法 n");printf("t 2、稀疏矩阵的转置 n");printf("输入要进行的项目的编号:"); scanf("%d",&flag); Creat(A); printf("矩阵A:n"); Print_SMatrix(A); switch(flag) case 1:Creat(B);n=1;printf("矩阵B:n"); Print_SMatrix(B); if(A.hs=B.hs && A.ls=B.ls) printf("A+B:n"); AddSMatrix(A,B,C,n);Print_SMatrix(C); else printf("错误!行列不一致n"); break; case 2: printf("A->B:n"); TransposeSMarix(p,q); Print_SMatrix(B);break; default:printf("输入错误!n"); Destory_SMatrix(A); Destory_SMatrix(B);Destory_SMatrix(C); 五、实验总结教师评语:实验成绩:指导教师签名: 批阅日期: 10