收藏 分享(赏)

课程设计实验报告 稀疏矩阵应用.doc

上传人:微传9988 文档编号:2541598 上传时间:2018-09-21 格式:DOC 页数:10 大小:100.50KB
下载 相关 举报
课程设计实验报告 稀疏矩阵应用.doc_第1页
第1页 / 共10页
课程设计实验报告 稀疏矩阵应用.doc_第2页
第2页 / 共10页
课程设计实验报告 稀疏矩阵应用.doc_第3页
第3页 / 共10页
课程设计实验报告 稀疏矩阵应用.doc_第4页
第4页 / 共10页
课程设计实验报告 稀疏矩阵应用.doc_第5页
第5页 / 共10页
点击查看更多>>
资源描述

1、数据结构课程设计数据结构课程设计一. 题目:稀疏矩阵应用(限 1 人完成)要求:实现三元组,十字链表下的稀疏矩阵的加、转、乘的实现。(1)稀疏矩阵的存储(2)稀疏矩阵加法(3)矩阵乘法(4)矩阵转置二. 算法思想描述:1.算法概述:首先用两个结构体来定义十字链表元素:typedef struct OLNodeint i,j;int e;struct OLNode *right,*down;OLNode,*OLink;OLNode 结构为链表结点,i,j,e 分别表示稀疏矩阵中元素的行,列和值。typedef struct int mu,nu,tu; /行数 mu,列数 nu,非零元素的个数 t

2、uOLink *rhead,*chead;CrossList;CrossList 结构用于连接起各个结点,mu,nu,tu 分别表示整个矩阵的行数列数和非零元素的个数。整个程序包含 CreateSMatix_OL(用于创建十字链表) ,SMatrix_ADD(十字链表相加) ,ShowMAtrix(十字链表显示),MultSMatrix_OL(十字链表相乘) ,TurnSMatrix_OL(十字链表转置) ,DestroySMatrix_OL(十字链表销毁)六个函数。CreateSMatix_OL 的功能如下:首先输入稀疏矩阵的行数,列数,非零元素的个数,为*rhead 和*chead 分配内

3、存空间,并将十字链表中节点初始化为 NULL。然后依次输入非零元素的行,列,值,以 0 0 0 为结尾结束链表的连接和 while 循环。SMatrix_ADD 的功能如下:在初始化稀疏矩阵后选择十字链表相加会提示输入另一个稀疏矩阵,连接结束后SMatrix_ADD 函数以循环的方式比较非零元素是否为同一行列,如果是则两值相加,如果不是则把第二个元素加入链表中。ShowMAtrix 的功能如下:逐一输出链表的行,列,值三个元素知道达到表尾的 NULL。MultSMatrix_OL 的功能如下:2与相加类似,在初始化稀疏矩阵后选择十字链表相加会提示输入另一个稀疏矩阵,连接结束后 MultSMat

4、rix_OL 函数以循环的方式比较非零元素是否为同一行列,如果是则两值相乘,如果不是则修改原来的元素值为 0。TurnSMatrix_OL 的功能如下:逐一查找十字链表中各个元素,将他们的 i,j 值对调已达到转置的目的.2.算法具体分析(1) 、输入需要执行的操作:1 为创建稀疏矩阵,调用 CreateSMatix_OL 函数,输入稀疏矩阵的行数列数和非零元素的个数(如 2 2 1,中间以空格分开)CreateSMatix_OL 函数会将各个元素的信息保存在十字链表的结点中并连接起来。2 为退出程序。(2) 、选择接下来要执行的操作:1 为稀疏矩阵转置调用 TurnSMatrix_OL 函数

5、逐一查找十字链表中各个元素,将他们的 i,j 值对调已达到转置的目的。2 为稀疏矩阵相加,调用 SMatrix_ADD 函数创建另一个稀疏矩阵并且将两矩阵中的非零元素相加。3 为稀疏矩阵相乘,调用 MultSMatrix_OL 函数创建另一个稀疏矩阵并且将两矩阵中的同行列的非零元素项相乘,其余项修改为 0。4 为退出。(3) 、程序显示操作结果,运行正常,结果正确。三、程序结构main()函数退出CreateSMatix_OL()函数exit()函数TurnSMatrix_OL()函数Switch()函数Switch()函数ShowMAtrix()函数CreateSMatix_OL();函数S

6、Matrix_ADD();函数ShowMAtrix()函数CreateSMatix_OL()函数MultSMatrix_OL()函数ShowMAtrix()函数3四、实验结果与分析上述程序在 Visual C+ 6.0 环境下加以实现,经过多次的测试,程序运行正确。例如:输入 1,再输入 2 2 1 接着输入非零元素为第 2 行第 1 列值为 9(2 1 9).运行结果如图 2,图中创建十字链表成功可以选择后续操作稀疏矩阵转置,稀疏矩阵相加,稀疏矩阵相乘。图 2选择稀疏矩阵相加实验,输入 2,再输入 2 2 2 创建另一个稀疏矩阵,接着输入 1 1 9 和 2 1 1 两个非零元素,SMatr

7、ix_ADD 函数会将两个矩阵的非零元素相比较,在同行列的值相加,不在同行列的为十字链表添加结点,计算结果如图 3,可以看到第一行第一列的元素 9 被加入到链表中,而第 2 行第 1 列的两个元素 9 和 1 相加得到 10,程序运行成功。4图 3五体会通过这次课程设计,我有很深的体会,具体如下:1. 十字链表的建立,和使用有了更深层次的理解。2. 各种循环语句的使用和 switch 语句的应用比较熟悉了。3. 把各个功能写在不同的函数体里,分工明确,条理清晰,这样不但语句简洁,而且十分明了。4. 从用户角度出发来编写程序,使结果尽量简洁明了。附代码:#include#include#incl

8、ude#define MAXSIZE 100int num100;typedef struct OLNodeint i,j;int e;struct OLNode *right,*down;OLNode,*OLink;typedef struct int mu,nu,tu; /行数 mu,列数 nu,非零元素的个数 tuOLink *rhead,*chead;CrossList;5int CreateSMatix_OL(CrossList OLink q;OLink p;printf(“请输入稀疏矩阵的行数,列数,非零元素的个数:“);scanf(“%d%d%d“,M.rhead=(OLink

9、 *)malloc(M.mu+1)*sizeof(OLNode);M.chead=(OLink *)malloc(M.nu+1)*sizeof(OLNode);for( i=1;ii=i;p-j=j;p-e=e;if(M.rheadi=NULL|M.rheadi-jj)p-right=M.rheadi;M.rheadi=p;elseq=M.rheadi;while(q-rightp-right=q-right;q-right=p;if(M.cheadj=NULL|M.cheadj-ii)p-down=M.cheadj;M.cheadj=p;elseq=M.cheadj;while(q-down

10、p-down=q-down;q-down=p;scanf(“%d%d%d“,return 1;/创建十字链表int Compare(int a1,int b1,int a2,int b2)if(a1a2)return 1;else if(a1b2)return 1;if(b1tu+B-tu;for(j=1;jnu;j+)cpj=A-cheadj;for(i=1;imu;i+)pa=A-rheadi;pb=B-rheadi;pre=NULL;while(pb)if(pa=NULL|pa-jpb-j)p=(OLink)malloc(sizeof(OLNode);if(!pre)A-rheadi=p

11、;else pre-right=p;p-right=pa;pre=p;p-i=i;p-j=pb-j;p-e=pb-e;if(!A-cheadp-j)A-cheadp-j=cpp-j=p;p-down=NULL;elsecpp-j-down=p;cpp-j=p;pb=pb-right;else if(pa-jj)pre=pa;pa=pa-right;else if(pa-e+pb-e)t-;pa-e+=pb-e;pre=pa;pa=pa-right;pb=pb-right;else t=t-2;if(!pre)A-rheadi=pa-right;else pre-right=pa-right;p

12、=pa;pa=pa-right;7if(A-cheadp-j=p)A-cheadp-j=cpp-j=p-down;else cpp-j-down=p-down;free(p);pb=pb-right;A-mu=A-muB-mu?A-mu:B-mu;A-nu=A-nuB-nu?A-nu:B-nu;return 1;/十字链表相加int ShowMAtrix(CrossList *A)int col;OLink p;for(col=1;colmu;col+)if(A-rheadcol)p=A-rheadcol;while(p)printf(“%3d%3d%3dn“,p-i,p-j,p-e);p=p

13、-right;return 1;/十字链表显示int MultSMatrix_OL(CrossList M, CrossList N, CrossList /中间变量OLink p0, q0, p, pl, pla; /中间变量/检查稀疏矩阵 M 的列数和 N 的行数是否对应相等if(M.nu != N.mu)printf ( “稀疏矩阵 A 的列数和 B 的行数不相等,不能相乘。n“ );return 0; Q.mu = M.mu, Q.nu = N.nu, Q.tu = 0;if(!(Q.rhead = (OLink *)malloc(Q.mu + 1) * sizeof(OLink) e

14、xit(-2);if(!(Q.chead = (OLink *)malloc(Q.nu + 1) * sizeof(OLink) exit(-2);for(i = 1; i j q0-i) q0 = q0-down; /M 的列大于 N 的行,则 N的列指针后移else if(p0-j i) p0 = p0-right;/M 的列小于 N 的行,则 M的行指针右移else /M 的行等于 N 的列e += p0-e * q0-e; /乘积累加q0 = q0-down, p0 = p0-right;/移动指针if(e)/乘积不为 0if(!(p = (OLink)malloc(sizeof(OL

15、Node) exit(-2);Q.tu+;/非零元素增加p-i = i, p-j = j, p-e = e, p-right = NULL, p-down = NULL;/赋值,指针后移/将 p 插入十字链表/行插入if(Q.rheadi = NULL) /若 p 为该行的第 1 个结点Q.rheadi = pl = p; /p 插在该行的表头且 pl指向 p(该行的最后一个结点)else pl-right = p, pl = p; /插在 pl 所指结点之后,pl 右移/列插入if(Q.cheadj = NULL) /若 p 为该列的第一个结点Q.cheadj = p; /该列的表头指向 p

16、else /插在列表尾pla = Q.cheadj;/pla 指向 j 行的第 1 个结点while(pla-down) pla = pla-down;/pla 指向 j 行最后一个结点pla-down = p; return 1;/十字链表相乘void TurnSMatrix_OL(CrossList OLink p,q;for(col=1;coli;p-i=p-j;p-j=row;q=p-right;p-right=p-down;p-down=q;/十字链表转置int DestroySMatrix_OL(CrossList /中间变量OLink p, q;/中间变量if(!M.rhead

17、| !M.chead) return 1;/M 不存在else /M 存在if(M.chead)/所有列链表头指针置为空for(i = 1; i right;free(q); /释放行和列链表头指针指向基址free(M.rhead);free(M.chead);/返回return 1;/十字链表销毁void main()10int n,i;/TSMatrix M,T,S;CrossList MM,TT,SS;printf(“请你选择操作:n1:用十字建表创建稀疏矩阵。n2:退出n(1|2):“);scanf(“%d“,switch(n)case 1:CreateSMatix_OL(MM);pr

18、intf(“已经选择十字链表创建稀疏矩阵,请选择操作n1:稀疏矩阵转置n2:稀疏矩阵相加n3:稀疏矩阵相乘n4:退出n(1|2|3|4):“);scanf(“%d“,switch(i)case 1:TurnSMatrix_OL(MM);ShowMAtrix(break;case 2:printf(“请你输入另一个稀疏矩阵:“);CreateSMatix_OL(TT);SMatrix_ADD(ShowMAtrix(break;case 3:printf(“请你输入另一个稀疏矩阵:“);CreateSMatix_OL(TT);MultSMatrix_OL(MM,TT,SS);ShowMAtrix(break;case 4:exit(0);break;case 2:exit(0);default :printf(“erorr“);

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 中等教育 > 小学课件

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报