ImageVerifierCode 换一换
格式:DOCX , 页数:51 ,大小:494.75KB ,
资源ID:27026774      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/27026774.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(数据结构三元组稀疏矩阵完整版实用资料.docx)为本站会员(b****4)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

数据结构三元组稀疏矩阵完整版实用资料.docx

1、数据结构三元组稀疏矩阵完整版实用资料数据结构三元组稀疏矩阵(完整版)实用资料(可以直接使用,可编辑 完整版实用资料,欢迎下载)一、课程设计的目的1.将C+语言理论基础实例化。2.掌握关于编程的技巧和方法。3.培养解决综合性实际问题的能力。二、课程设计任务题目:稀疏矩阵A,B的和题目要求:稀疏矩阵A,B用三元组顺序表存储。 三元组表C存放结果矩阵 A,B的和存到C中。题目:用三元组C存放以三元组顺序表做存储结构的稀疏矩阵A,B的和一、 题目分析三元组表C是结果矩阵,其中元素仍行优先排列,按元素的行列去找A中的三元组,若有,则加入C,同时,这个元素如果在B中也有,则加上B的这个元素值,否则这个值就

2、不变;如果A中没有,则找B,有则插入C,无则查找下一个矩阵元素。两个稀疏矩阵的非零元素按三元组表形式存放,二、 程序代码#include#include #define max 10typedef structint i,j;int v;spnode;typedef structint mu,nu,tu;spnode datamax;spmatrix;addmatrix(spmatrix *a,spmatrix *b)spmatrix *c;int p=0;q=0;col; c=(spmatrix*)malloc(sizeof(spmatrix); c-mu=a-mu;c-nu=a-nu; c

3、-tu=0;while (ptu&qtu) if(a- datap.i=B- dataq.i)&(A- datap.j=B- dataq.j) col=a- datap.v+B- dataq.v; if(col!=0) c- datac- tu.i=a- datap.i;c- datac- tu.j=a- datap.j;c- datac- tu+.v=col;p+;q+; if (a- datap.i=b- dataq.i)&(a- datak.j datal.j) c- datac- tu.i=a- datap.i;c- datac- tu.j=a- datap.j;c- datac- t

4、u+.v=a- datap.v;p+;if (a- datap.i=b- dataq.i)&(a- datak.j b- datal.j) c- datac- tu.i=a- datap.i;c- datac- tu.j=a- datap.j;c- datac- tu+.v=a- datap.v;q+; while (ptu) c- datac- tu.i=a- datap.i; c- datac- tu.j=a- datap.j; c- datac- tu+.v=a- datap.v; p+;while(qtu) c- datac- tu.i=b- dataq.i; c- datac- tu

5、.j=b- dataq.j; c- datac- tu+.v=b- dataq.v; q+;void Setmatrix(SPMatrix* p)int n; cout请输入矩阵行数、列数及非0元个数p-muP-nup-tu;cout三元组表endl; for(n=1;ntu;n+)cinp-datan.ip-datan.jp-datan.v; void main()spmatrix a;spmatrix b;int i,j,k = 1;spmatrix *c; Setmatrix(&a); Setmatrix(&b); c = addmatrix(&a,&b); cout三元组表cendl;

6、 for (i = 1; i mu; +i) for (j = 1;j nu ; +j) if (pc-datak.i = i & pc-datak.j = j) coutijdatak.v); k+; free(c);三、 运行结果四、总结三元组存储的矩阵的加法关键在于算法的分析。而数据结构比较C语言层次性更强。写算法的时候不是很难,就是对主函数的写法有点模糊。总体上讲,实践将理论具体化,也更容易进一步的学习。计算机科学技术学院学生课程设计(论文)题 目:学生姓名: 学 号: 所在院(系):专 业:班 级:指 导 教 师: 职称:年 月 日计算机科学技术学院本科学生课程设计任务书注:任务书由

7、指导教师填写。课程设计(论文)指导教师成绩评定表稀疏矩阵的操作1.课程设计的目的本课程设计是为了配合数据结构课程的开设,通过设计一完整的程序,使学生掌握数据结构的应用、算法的编写、类C语言的算法转换成C程序并用TC上机调试的基本方法。利用三元组实现稀疏矩阵的有关算法。2问题描述2.1稀疏矩阵采用三元组表示,求两个具有相同行列数的稀疏矩阵A和B的相加矩阵C,并输出C。2.2求出A的转置矩阵D,输出D。3. 基本要求稀疏矩阵是指那些多数元素为零的矩阵。利用“稀疏”特点进行存储和计算可以大大节省存储空间,提高计算效率。实现一个能进行稀疏矩阵基本运算的运算器。以“带行逻辑链接信息”的三元组顺序表表示稀

8、疏矩阵,实现两个矩阵相加、相减和相乘的运算。稀疏矩阵的输入形式采用三元组表示,而运算结果的矩阵则通常以阵列形式列出。4.结构设计4.1.以“带行逻辑链接信息”的三元组顺序表表示稀疏矩阵,实现两个矩阵相加、相减和相乘的运算。4.2.稀疏矩阵的输入形式采用三元组表示,而运算结果的矩阵则通常以阵列形式列出。4.3.首先应输入矩阵的行数和列数,并判别给出的两个矩阵的行、列数对于所要求作的运算是否相匹配。可设矩阵的行数和列数均不超过20。4.4.程序可以对三元组的输入顺序加以限制,例如,按行优先。注意研究教材的算法,以便提高计算效率。5.在用三元组表示稀疏矩阵时,相加或相减所得结果矩阵应该另生成,乘积矩

9、阵也可用二维数组存放5.算法思想5.1主函数设置循环和选择语句进行运算循环和选择,进行稀疏矩阵的加法,减法,乘法,转置和是否继续运算5个分支开关进行运算选择。5.2设置函数分别实现稀疏矩阵的输入,输出,加法,减法,乘法。5.3在数组结构体中设置存放每行第一个非零元在其数组存储结构单元的位置的存储单元,若该行无非零元,则存为06.模块划分6.1typedef struct存放各行第一个非零元在存储数组中的位置,若该行无非零元,则其rpos值为零6.2 createsmatrix(rlsmatrix *M) 矩阵输入函数,输入各行非零元及其在矩阵中的行列数6.3 FasttransposeRLSM

10、atrix(RLSMatrix M,RLSMatrix *Q) 矩阵快速转置6.4 HeRLSMatrix(RLSMatrix *M,RLSMatrix *N,RLSMatrix *Q) 矩阵求和6.5 ChaRLSMatrix(RLSMatrix *M,RLSMatrix *N,RLSMatrix *Q) 矩阵求差6.6 JiRLSMatrix(RLSMatrix M,RLSMatrix N,RLSMatrix *Q) 矩阵求积7.算法实现7.1首先定义非零元个数的最大值和存放各行第一个非零元在存储数组中的位置 #include#define MAXSIZE 100 /* 非零元个数的最大值

11、 */typedef struct tripleint i,j; /* 行下标,列下标 */int e; /* 非零元素值 */triple;typedef struct tsmatrixtriple dataMAXSIZE+1; /* 非零元三元组表,data0未用 */int mu,nu,tu; /* 矩阵的行数、列数和非零元个数 */* 各列第一个非零元的位置表rpos0未用 */rlsmatrix;7.2创建稀疏矩阵矩阵的行数,列数,和非零元素的个数并按行序顺序输入第%d个非零元素所在的行(1%d),列(1%d),元素值。createsmatrix(rlsmatrix *M) /* 创

12、建稀疏矩阵M */int e,i,m,n;M-data0.i=0; /* 为以下比较顺序做准备 */printf(请输入矩阵的行数,列数,和非零元素的个数:);scanf(%d,&M-mu);scanf(%d,&M-nu);scanf(%d,&M-tu);for(i=1;itu;i+)printf(请按行序顺序输入第%d个非零元素所在的行(1%d),列(1%d),元素值:,i,M-mu,M-nu); scanf(%d,&m);scanf(%d,&n);scanf(%d,&e);if(mM-mu|nM-nu) /*行或列超出范围 */printf(行或列超出范围);getch();exit();

13、if(mdatai-1.i|m=M-datai-1.i&ndatai-1.j) /*行或列的顺序有错*/printf(行或列的顺序有错);getch();exit();M-datai.i=m;M-datai.j=n;M-datai.e=e;7.3求矩阵的快速转置cpos为存放每列的第一个非零元素的地址,temp为中间变量对cpos对初始化,判断初值为0则为cpos赋值,然后进行转置。void transposesmatrix(rlsmatrix M,rlsmatrix *T) /* cpos存放每列的第一个非零元素的地址,temp中间变量 */int i,m,*cpos,*temp,k=0;T

14、-mu=M.nu;T-nu=M.mu;T-tu=M.tu;cpos=(int *)malloc(M.mu*sizeof(int);if(cpos=NULL)exit();temp=(int *)malloc(M.mu*sizeof(int);if(temp=NULL)exit();/* 对cpos对初始化,初值为0 */*(cpos+1)=0;for(i=1;i=M.nu;i+)for(m=1;m1)*(cpos+i)=*(temp+i-1)+1;free(temp);for(i=1;idata*(cpos+M.datai.j).i=M.datai.j;T-data*(cpos+M.datai

15、.j).j=M.datai.i;T-data*(cpos+M.datai.j).e=M.datai.e;(*(cpos+M.datai.j)+;free(cpos);7.3矩阵的相乘设置两个指针,分别指向M,N的第一个非零元位置,移动指针进行比较,得出相加后的新矩阵非零元。定义Qe为矩阵Q的临时数组,矩阵Q的第i行j列的元素值存于*(Qe+(M.datai.i-1)*N.nu+N.dataj.j)中,初值为0,结果累加到Qe,*Qe矩阵中,因为M的每一行和N的每一列相乘都是T的一个元素,不管它是零或非零,当M的第一行和N的第一列相乘则得T的第一个元素;当M的第一行和N的第二列相乘则得T的第二个

16、元素,M的第i行和N的第j列相乘则得T的第p个元素;根据归纳法得p=(i-1)*N的列数+j。multsmatrix(rlsmatrix M,rlsmatrix N,rlsmatrix *T)int i,j,Qn=0;int *Qe;if(M.nu!=N.mu)printf(两矩阵无法相乘);getch();exit();T-mu=M.mu;T-nu=N.nu;Qe=(int *)malloc(M.mu*N.nu*sizeof(int); /* Qe为矩阵Q的临时数组*/for(i=1;i=M.mu*N.nu;i+)*(Qe+i)=0;/* 矩阵Q的第i行j列的元素值存于*(Qe+(M.dat

17、ai.i-1)*N.nu+N.dataj.j)中,初值为0 */ for(i=1;i=M.tu;i+) /* 结果累加到Qe */for(j=1;j=N.tu;j+)if(M.datai.j=N.dataj.i)*(Qe+(M.datai.i-1)*N.nu+N.dataj.j)+=M.datai.e*N.dataj.e;for(i=1;i=M.mu;i+) /*Qe矩阵中,因为M的每一行和N的每一列相乘都是T的一个元素,不管它是零或非零 */for(j=1;jdataQn.e=*(Qe+(i-1)*N.nu+j);T-dataQn.i=i;T-dataQn.j=j;free(Qe);T-tu

18、=Qn;return ;7.4矩阵的相加编写一个求两个对称矩阵相加运算的函数。设对称矩阵的数据元素为整数类型,对称矩阵采用压缩存储方法存储,要求和矩阵采用非压缩方法存储。设置两个指针,分别指向M,N的第一个非零元位置,移动指针进行比较,得出相加后的新矩阵非零元计算各行第一个非零元素在存储数组中的位置,若该行无非零元,则rpos值为零。HeRLSMatrix(RLSMatrix *M,RLSMatrix *N,RLSMatrix *Q)/矩阵求和函数if(*M).mu!=(*N).mu|(*M).nu!=(*N).nu)printf(不满足矩阵相加的条件!);return 0;int k=1;

19、Triple *p,*q;元/设置两个指针,分别指向M,N的第一个非零元位置,移动指针进行比较,得出相加后的新矩阵非零p=&(*M).data1; q=&(*N).data1; while(p(*M).data+(*M).tu+1&q(*N).data+(*N).tu+1) if(*p).i=(*q).i) if(*p).i(*q).i) (*Q).datak.i=(*p).i; (*Q).datak.j=(*p).j; (*Q).datak.e=(*p).e; k+;p+; else if(*p).j=(*q).j) if(*p).j(*q).j) (*Q).datak.i=(*p).i;

20、(*Q).datak.j=(*p).j; (*Q).datak.e=(*p).e; k+;p+; (*Q).datak.i=(*p).i; (*Q).datak.j=(*p).j; (*Q).datak.e=(*p).e+(*q).e; k+;p+;q+; else else (*Q).datak.i=(*q).i; (*Q).datak.j=(*q).j; (*Q).datak.e=(*q).e; k+;q+; else (*Q).datak.i=(*q).i; (*Q).datak.j=(*q).j; (*Q).datak.e=(*q).e; k+;q+; if(p=(*M).data+(

21、*M).tu)while(p=(*M).data+(*M).tu) (*Q).datak.i=(*p).i; (*Q).datak.j=(*p).j;(*Q).datak.e=(*p).e;k+;p+;if(q=(*N).data+(*N).tu)while(q=(*N).data+(*N).tu)(*Q).datak.i=(*q).i; (*Q).datak.j=(*q).j; (*Q).datak.e=(*q).e; k+;q+; (*Q).mu=(*M).mu;(*Q).nu=(*M).nu;(*Q).tu=k-1;/计算各行第一个非零元素在存储数组中的位置 /若该行无非零元,则rpos

22、值为零 for(k=1;k=(*Q).tu;k+) +num(*Q).datak.i; for(row=2;row=(*Q).mu;row+) cpotrow=cpotrow-1+numrow-1; for(row=1;row=(*Q).mu;row+) if(cpotrow=(*Q).tu) if(*Q).datacpotrow.i=row) (*Q).rposrow=cpotrow; else (*Q).rposrow=0; else (*Q).rposrow=0; int num(*Q).mu+1,row,cpot(*Q).mu+1; cpot1=1; for(k=1;k=(*Q).mu

23、;k+) numk=0;8.系统运行结果图1输入第一个矩阵A图2输入第二个矩阵B 两个矩阵的和图3矩阵A的转置矩阵D9.心得体会通过一周的课程设计使我对数据结构有了更深的理解,对以前学习中不明白的,不理解的都有了进一步的理解。在实际操作中遇到了很多困难,但通过找资料,请教同学和老师,使我的动手能力和沟通能力都有了提高。在整个课程设计中总是在编写程序中发生错误,有时会很没耐性,但都被我一一克服了,编程一定要有耐心,同时还有认真仔细,尽量保证不出现错误。编程要有条理,不仅使自己要看懂 ,别人也能看懂,这样有利于程序的改正。在做完这个课程设计时,心里有种说不出来的高兴,自己动手完成的设计有一种成就感

24、,增强了自己的自信心,我相信在今后的学习中,我会保持这种良好的心情投入到各科的学习中,使我的成绩不断提高。10.参考文献1 严蔚敏 吴伟名 编著,数据结构M., 清华大学出版社, 2001年1月20-252 张颖江 胡燕 主编,C语言程序设计M., 科学出版社 ,1998年7月46-803 殷人昆, 数据结构M.,清华大学出版社, 2001年3月 120-1694 徐孝凯 ,数据结构实用教程M.,清华大学出版社,1999年12月 47-805 Adam Drozdek(美),数据结构与算法M., 机械工业出版社 ,2003年7月 69-8911.附录源程序清单#include#define M

25、AXSIZE 100 /* 非零元个数的最大值 */typedef struct tripleint i,j; /* 行下标,列下标 */int e; /* 非零元素值 */triple;typedef struct tsmatrixtriple dataMAXSIZE+1; /* 非零元三元组表,data0未用 */int mu,nu,tu; /* 矩阵的行数、列数和非零元个数 */* 各列第一个非零元的位置表rpos0未用 */rlsmatrix;createsmatrix(rlsmatrix *M) /* 创建稀疏矩阵M */int e,i,m,n;M-data0.i=0; /* 为以下

26、比较顺序做准备 */printf(请输入矩阵的行数,列数,和非零元素的个数:);scanf(%d,&M-mu);scanf(%d,&M-nu);scanf(%d,&M-tu);for(i=1;itu;i+)printf(请按行序顺序输入第%d个非零元素所在的行(1%d),列(1%d),元素值:,i,M-mu,M-nu); scanf(%d,&m);scanf(%d,&n);scanf(%d,&e);if(mM-mu|nM-nu) /*行或列超出范围 */printf(行或列超出范围);getch();exit();if(mdatai-1.i|m=M-datai-1.i&ndatai-1.j)

27、/*行或列的顺序有错*/printf(行或列的顺序有错);getch();exit();M-datai.i=m;M-datai.j=n;M-datai.e=e;void transposesmatrix(rlsmatrix M,rlsmatrix *T) /* cpos存放每列的第一个非零元素的地址,temp中间变量 */int i,m,*cpos,*temp,k=0;T-mu=M.nu;T-nu=M.mu;T-tu=M.tu;cpos=(int *)malloc(M.mu*sizeof(int);if(cpos=NULL)exit();temp=(int *)malloc(M.mu*sizeof(int);if(temp=NULL)exit();/* 对cpos对初始化,初值为0 */*(cpos+1)=0;for(i=1;i=M.nu;i+)for(m=1;m=M.tu;m+)if(M.datam.j=i)k+;tempi=k;if(i=1&k!=0)*(cpos+i)=1;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1