稀疏矩阵的存储实现_第1页
稀疏矩阵的存储实现_第2页
稀疏矩阵的存储实现_第3页
稀疏矩阵的存储实现_第4页
稀疏矩阵的存储实现_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、武汉理工大学数据结构课程设计说明书课程设计任务书学生姓名: 宋吉松专业班级:软件1202班指导教师: 李晓红工作单位:计算机科学与技术学院题目:稀疏矩阵的存储实现初始条件:理论:学习了数据结构课程,掌握了一种计算机高级语言。实践:计算机技术系实验中心提供计算机及软件开发环境。要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写 等具体要求)1、系统应具备的功能:(1)实现稀疏矩阵的三元组和十字链表两种存储结构(2)实现稀疏矩阵的基本运算(3)输出结果2、数据结构设计;3、主要算法设计;4、编程及上机实现;5、撰写课程设计报告,包括:(1)设计题目;(2)摘要和关键字(中文和英文

2、);(3)正文,包括引言、需求分析、数据结构设计、算法设计、有关技术 的讨论、设计体会等;(4)结束语;(5)参考文献。时间安排:2013年12月16日-25日指导教师签名:李晓红2013年12月14日系主任(或责任教师)签名:武汉理工大学数据结构课程设计说明书摘 要 本课程设计在学习数据结构的前提下,运用 c语言,对稀疏矩阵进 行三元组存储和十字链表存储,并完成稀疏矩阵的转置,相加,相乘等基本运算。 关键词 稀疏矩阵 三元组十字链表基本运算abstract this course is designed on the premise of learning datastructures us

3、ing c language, for sparse matrix triple store to store and cross-linked, and were achieved under the two storage sparse matrix transpose, add, multiply, and other basic operations.keywords sparse matrix triples crusaders basic operations武汉理工大学数据结构课程设计说明书目录弓i言11需求分析1.1 稀疏矩阵三元组表和十字链表两种存储的实现 21.2 稀疏矩阵

4、转置 21.3 稀疏矩阵的相加相乘 21.4 输出结果 22数据结构设计2.1 三元组的结构体22.2 十字链表的结构体 33算法设计3.1 三元组35583.1.1 三元组的创建3.1.2 三元组的转置3.1.3 三元组的相加3.1.4 三元组的相乘3.1.5 三元组的显示 103.2 十字链表3.2.1 十字链表的创建113.2.2 十字链表的显示 123.3 主函数 134设计体会165结束语16附1参考文献16附2源代码17附3运行结果382武汉理工大学数据结构课程设计说明书引言什么是稀疏矩阵?人们无法给出确切的定义, 它只是一个凭人们的直觉来了解 的概念。假设在mix n的矩阵中,有

5、t个元素不为零。令q=t/(m xn),称q为矩 阵的稀疏因子。通常认为q=0.05时称为稀疏矩阵。按照压缩存储的概念,值存稀疏矩阵的非零元。因此,除了寻出非零元的值外, 还必须同时记下它所在的行和列的位置。反之,一个三元组唯一确定了矩阵a的一个非零元。由此,稀疏矩阵可由表示非零元的三元组及其行列数唯一确定。其存储方法有三种,分别是三元组顺序表,行逻辑链接的顺序表,十字链表。分 别是以顺序存储结构,带行连接信息的三元组表,及链式存储结构进行存储表示。第10页1需求分析1.1 稀疏矩阵三元组表和十字链表两种存储的实现三元组表的实现通过建立两个结构体,分别用来表示三元组的行数、列数、非 零元数和元

6、素的行、列坐标、值。然后通过for循环进行赋值。并求出每行含有 的非零元个数。十字链表与三元组的不同在于用链表来存储每一行,每一列的元素信息。1.2 稀疏矩阵的转置稀疏矩阵的转置即将行列值进行调换,将元素的行列值进行调换,重排每个元 素的次序。如何重排?三元组按照原矩阵m的列序进行转置。为了找到m的每个 元素,要对三元组表从第一行开始进行扫描, 便可得到转置后矩阵的顺序。十字 链表需要将元素的行指针和列指针调换。1.3 稀疏矩阵的相加相乘两个矩阵相加及每个元素分别对应相加。两个矩阵的相乘mx n=s即m的行元素与n的列元素分别对应乘积的累加, 得到的即为s以m的行,n的列为坐标的元素的值。1.

7、4 输出结果可以用for或while循环,输出两种表示下的稀疏矩阵。三元组每个元素的行坐标,列坐标,值三元组各行第一个元素的位置三元组矩阵的行数,列数,非零元个数三元组结构体定义;typedef struct int mu,nu,tu;/olink *rhead,*chead;/crosslist;/矩阵的行数,列数,非零元个数行和列头指针十字链表结构体定义2数据结构设计2.1 三元组的结构体typedef struct int i,j;/int e;triple;typedef structtriple datamaxsize+1;int rposmaxsize + 1; / int mu,

8、nu,tu; / tsmatrix;/2.2 十字链表的结构体typedef struct olnode int i,j;int e;/十字链表每个元素的行坐标,列坐标,值struct olnode *right,*down;olnode,*olink;3算法设计3.1.1三元组的创建void createsmatrix(tsmatrix &m)/采用三元组顺序表存储表示,创建稀疏矩阵mprintf(”请输入稀疏矩阵的行数列数非零元个数:n);scanf(%d%d%d”,&m.mu,&m.nu,&m.tu);if(m.mu=0)|(m.nu=0)|(m.tum.mu*m.nu)/判断行值、列值

9、、元素个数是否合法printf(输入有误!);for(int i=1;i=m.tu;i+)输入稀疏矩阵元素printf(请输入请输入非零元的行坐标列坐标值:);scanf(%d%d%d”,&m.datai.i,&m.datai.j,&m.datai.e);if(m.datai.i=0)|(m.datai.j=0)printf(输入错误,请重新输入!”);scanf(%d%d%d”,&m.datai.i,&m.datai.j,&m.datai.e);/if/forint num100;if(m.tu)int i;for(i = 1; i = m.mu; i+) numi = 0;初始化for(i

10、nt t = 1; t = m.tu; t+) +numm.datat.i;求 m 中每一行含非零元素个数求 rposm.rpos1 = 1;for(i = 2; i = m.mu; i+) m.rposi = m.rposi-1 + numi-1;/创建三元组3.1.2 三元组的转置void transposesmatrix(tsmatrix m,tsmatrix &t)t.nu=m.mu;/通过三元组表示,将 m转置为tt.mu=m.nu;t.tu=m.tu;int q=1;for(int col=1;col=m.nu;col+)for(int p=1;pa2)return 1;else

11、if(a1b2)return 1;if(b1t.mu?m.mu:t.mu;/对 s 矩阵的行数赋值s.nu=m.nut.nu?m.nu:t.nu;/对 s 矩阵的列数赋值s.tu=0;int ce;int q=1;int mcount=1,tcount=1;while(mcount=m.tu&tcount=t.tu)switch(compare(m.datamcount.i,m.datamcount.j,t.datatcount.i,t.datatcount.j) )/用switch分支语句,用compare函数对需要相加的两个矩阵的某元素行数 列数进行比较case -1: s.dataq.e

12、=m.datamcount.e; s.dataq.i=m.datamcount.i;s.dataq.j=m.datamcount.j; q+;mcount+;break;case 1: s.dataq.e=t.datatcount.e; s.dataq.i=t.datatcount.i;s.dataq.j=t.datatcount.j; q+;tcount+;break;case 0: ce=m.datamcount.e+t.datatcount.e;醍他情况下把两个矩阵的值相加if(ce) s.dataq.e=ce;s.dataq.i=m.datamcount.i;s.dataq.j=m.d

13、atamcount.j;q+;mcount+;tcount+;else mcount+;tcount+;break;while(mcount=m.tu)s.dataq.e=m.datamcount.e;s.dataq.i=m.datamcount.i;s.dataq.j=m.datamcount.j;q+;mcount+; /在case=-1的情况下对s矩阵的非零值,行数,列数进行赋值 while(tcount=m.tu)s.dataq.e=t.datatcount.e;s.dataq.i=t.datatcount.i;s.dataq.j=t.datatcount.j;q+;tcount+;/

14、在case=1的情况下对s矩阵的非零值,行数,列数进行赋值 s.tu=q-1;/三元组相加3.1.4三元组的相乘int multsmatrix(tsmatrix m, tsmatrix n, tsmatrix &q) int arow, brow, ccol, i, t, ctemp100, p, q, tp;/ 定义相乘函数中所需要用到 的变量if(m.nu != n.mu) return 0;/如果第一个矩阵的行数不等于第二个矩阵的 列数,则退出q.mu = m.mu, q.nu = n.nu, q.tu = 0;/三元组结构类型 q存放相乘后的结 果if(m.tu * n.tu != 0

15、)/如果两个矩阵元素相乘不为零,则进行运算 for(arow = 1; arow = m.mu; +arow)/最外侧循环以矩阵行数作为 循环变量for(i = 0; i = n.nu; +i) ctempi = 0;q.rposarow = q.tu + 1;if(arow m.mu) tp = m.rposarow + 1;else tp = m.tu +1;for(p = m.rposarow; p tp; +p)/ 把每行与每列相乘 brow = m.datap.j;if(brow n.mu) t = n.rposbrow+1;else t = n.tu + 1;for(q = n.r

16、posbrow; q t; +q)ccol = n.dataq.j;ctempccol += m.datap.e * n.dataq.e;/ 值相乘for(ccol = 1; ccol maxsize) return 1;q.dataq.tu.i = arow, q.dataq.tu.j = ccol, q.dataq.tu.e = ctempccol;return 1;/三元组相乘3.1.5 三元组的显示void showtmatrix(tsmatrix m)for(int col=1;col=m.mu;col+)/通过双重循环,把稀疏矩阵中不为零的元素的行数、列数和值显示出来for(int

17、 p=1;p=m.tu;p+)if(m.datap.i=col)printf(%4d %4d %4dn,m.datap.i,m.datap.j,m.datap.e);/三元组显示3.2.1 十字链表的创建void createsmatix_ol(crosslist &m)int i,j,e;olink p,q;printf(”请输入稀疏矩阵的行数列数非零元素的个数:n);/矩阵行数,列数下标均从开始;scanf(%d%d%d”,&m.mu,&m.nu,&m.tu);if(!(m.rhead=(olink *)malloc(m.mu+1)*sizeof(olnode) exit(1);/ 分配内

18、存空间if(!(m.chead=(olink *)malloc(m.nu+1)*sizeof(olnode) exit(1);/ 分配内存空间/把矩阵for( i=1;i=m.mu;i+)m.rheadi=null;每个元素置空值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-right&q-right-jright;p-right=q-right;q-right=p;if(m.cheadj=null|m.cheadj-ii)p-d

19、own=m.cheadj;m.cheadj=p;elseq=m.cheadj;while(q-down&q-down-idown;p-down=q-down;q-down=p;scanf(%d%d%d,&i,&j,&e);/创建十字链表3.2.2 十字链表的显示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-right;return 1;/十字链表显示3.3主函数/主函数vo

20、id main()int n,i;tsmatrix m,t,s;crosslist mm,tt,ss;printf(*稀疏矩阵的应用 *n);printf(n1 :用三元组创建稀疏矩阵n2:用十字链表创建稀疏矩阵n3:退出程序);printf(n);scanf(%d,&n);switch(n)case 1:createsmatrix(m);printf(您输入的稀疏矩阵为:n 行歹!j大小n);showtmatrix(m);printf(已经选择三元组创建稀疏矩阵,请继续选择:n1:稀疏矩阵转置n2:稀疏 矩阵相加n3:稀疏矩阵相乘n4:退出程序n);scanf(%d,&i);switch(i

21、)case 1:transposesmatrix(m,t);printf(转置后的矩阵为:n 行 歹大小n);showtmatrix(t);break;case 2:printf(请你输入另一个稀疏矩阵:);createsmatrix(t);addtmatix(m,t,s);printf(相加后的矩阵为:n 行 歹大小n);showtmatrix(s);break;case 3:printf(请你输入另一个稀疏矩阵:);createsmatrix(t);multsmatrix(m,t,s);printf(相乘后的矩阵为:n 行 歹大小n);showtmatrix(s);break;case 4

22、:exit(0);break;case 2:createsmatix_ol(mm);printf(您输入的稀疏矩阵为:n 行歹!j大小n);showmatrix(&mm);printf(已经选择十字链表创建稀疏矩阵,请选择操作:n1:稀疏矩阵转置n2:稀疏矩阵相加n3:稀疏矩阵相乘n4:退出程序n);scanf(%d,&i);switch(i)case 1:turnsmatrix_ol(mm);printf(转置后的矩阵为:n 行 歹大小n);showmatrix(&mm);break;case 2:printf(请你输入另一个稀疏矩阵:);createsmatix_ol(tt);smatri

23、x_add(&mm,&tt);printf(相加后的矩阵为:n 行 歹大小n);showmatrix(&mm);break;case 3:printf(请你输入另一个稀疏矩阵:);createsmatix_ol(tt);multsmatrix_ol(mm,tt,ss);列大小n);printf(相乘后的矩阵为:n 行showmatrix(&ss);break;case 4:exit(0);break;case 3:exit(0);default :printf(输入错误!);武汉理工大学数据结构课程设计说明书4设计体会及结束语通过设计本程序,加深了对矩阵存储的了解,掌握了稀疏矩阵三元组存储和十

24、 字链表存储两种存储方法。课本上介绍的较简略,有的地方甚至有个错误,经过 不断检查才最终发现,发现课本上的不一定是对的,同样的问题也许有更好的方 法。很多不懂的地方通过上网查资料, 借鉴别人的设计经验,学习新的函数最终 完成了本设计。通过这次课程设计,丰富了自己的专业知识,增强了自己解决问 题的能力,有很大帮助。完成这次设计要感谢指导老师李晓红老师,及室友们的帮助。第ii页武汉理工大学数据结构课程设计说明书附1参考文献11数据结构(c语言版)严蔚敏 吴伟民 清华大学出版社200721 c程序设计教程 张蕊 吕涛 华中科技大学出版社2012.9【3】c+向对象程序设计教程第3版 陈维兴 林小茶

25、清华大学出版社2009.641百度文库稀疏矩阵十字链表运算第27页附2源代码#include#include#define maxsize 10000 typedef struct olnodeint i,j;int e;/十字链表每个元素的行坐标,列坐标,值struct olnode *right,*down;typedef struct int mu,nu,tu;olink *rhead,*chead;crosslist;olnode,*olink;/矩阵的行数,列数,非零元个数/行和列头指针/十字链表结构体定义typedef structint i,j;/三元组每个元素的行坐标,列坐标,

26、值int e;triple;typedef structtriple datamaxsize+1;int rposmaxsize + 1; /三元组各行第一个元素的位置int mu,nu,tu;/三元组矩阵的行数,列数,非零元个数tsmatrix;/三元组结构体定义; void createsmatrix(tsmatrix &m)/采用三元组顺序表存储表示,创建稀疏矩阵mprintf(”请输入稀疏矩阵的行数列数非零元个数:n);scanf(%d%d%d”,&m.mu,&m.nu,&m.tu);if(m.mu=0)|(m.nu=0)|(m.tum.mu*m.nu)/判断行值、列值、元素个数是否合

27、法printf(输入有误!);for(int i=1;i=m.tu;i+)输入稀疏矩阵元素printf(请输入请输入非零元的行坐标列坐标值:);scanf(%d%d%d”,&m.datai.i,&m.datai.j,&m.datai.e);if(m.datai.i=0)|(m.datai.j=0)printf(输入错误,请而新输入!”);scanf(%d%d%d”,&m.datai.i,&m.datai.j,&m.datai.e);/if/forint num100;if(m.tu)int i;for(i = 1; i = m.mu; i+) numi = 0;初始化for(int t = 1

28、; t = m.tu; t+) +numm.datat.i; / 求 m 中每一行含非 零元素个数求 rposm.rpos1 = 1;for(i = 2; i = m.mu; i+) m.rposi = m.rposi-1 + numi-1;/创建三元组 void transposesmatrix(tsmatrix m,tsmatrix &t)t.nu=m.mu;/通过三元组表示,将 m转置为tt.mu=m.nu;t.tu=m.tu;int q=1;for(int col=1;col=m.nu;col+)for(int p=1;pa2)return 1;else if(a1b2)return

29、1;if(b1t.mu?m.mu:t.mu;/对 s 矩阵的行数赋值s.nu=m.nut.nu?m.nu:t.nu;/对 s 矩阵的列数赋值s.tu=0;int ce;int q=1;int mcount=1,tcount=1;while(mcount=m.tu&tcount=t.tu)switch(compare(m.datamcount.i,m.datamcount.j,t.datatcount.i,t.datatcount.j) )/用switch分支语句,用compare函数对需要相加的两个矩阵的某元素行数 列数进行比较case -1: s.dataq.e=m.datamcount.e

30、;/当 m.datamcount.it.datatcount.i 或m.datamcount.jt.datatcount.i 或m.datamcount.jt.datatcount.js.dataq.i=t.datatcount.i;s.dataq.j=t.datatcount.j;/把第二个矩阵的行数i,列数j赋值给s矩阵的行数 i,列数jq+;tcount+;break;case 0: ce=m.datamcount.e+t.datatcount.e;醍他情况下把两个矩阵的值相加if(ce) s.dataq.e=ce;s.dataq.i=m.datamcount.i;s.dataq.j=m

31、.datamcount.j;q+;mcount+;tcount+;else mcount+;tcount+;break;while(mcount=m.tu)s.dataq.e=m.datamcount.e;s.dataq.i=m.datamcount.i;s.dataq.j=m.datamcount.j;q+;mcount+; /在case=-1的情况下对s矩阵的非零值,行数,列数进行赋值 while(tcount=m.tu)s.dataq.e=t.datatcount.e;s.dataq.i=t.datatcount.i;s.dataq.j=t.datatcount.j;q+; tcount

32、+;/在case=1的情况下对s矩阵的非零值,行数,列数进行赋值s.tu=q-1;/三元组相加int multsmatrix(tsmatrix m, tsmatrix n, tsmatrix &q)int arow, brow, ccol, i, t, ctemp100, p, q, tp;/ 定义相乘函数中所需要用到 的变量if(m.nu != n.mu) return 0;/如果第一个矩阵的行数不等于第二个矩阵的 列数,则退出q.mu = m.mu, q.nu = n.nu, q.tu = 0;/三元组结构类型 q存放相乘后的结 果if(m.tu * n.tu != 0)/如果两个矩阵元素

33、相乘不为零,则进行运算 for(arow = 1; arow = m.mu; +arow)/最外侧循环以矩阵行数作为 循环变量for(i = 0; i = n.nu; +i) ctempi = 0;q.rposarow = q.tu + 1;if(arow m.mu) tp = m.rposarow + 1;else tp = m.tu +1;for(p = m.rposarow; p tp; +p)/ 把每行与每列相乘 brow = m.datap.j;if(brow n.mu) t = n.rposbrow+1;else t = n.tu + 1;for(q = n.rposbrow; q

34、 t; +q) ccol = n.dataq.j;ctempccol += m.datap.e * n.dataq.e;/ 值相乘for(ccol = 1; ccol maxsize) return 1;q.dataq.tu.i = arow, q.dataq.tu.j = ccol, q.dataq.tu.e = ctempccol;return 1;/三元组相乘void showtmatrix(tsmatrix m)for(int col=1;col=m.mu;col+)通过双重循环,把稀疏矩阵中不为零的元素的行 数、列数和值显示出来for(int p=1;p=m.tu;p+)if(m.d

35、atap.i=col)printf(%4d %4d %4dn,m.datap.i,m.datap.j,m.datap.e);/三元组显示void createsmatix_ol(crosslist &m)int i,j,e,t=1;olink p,q;printf(”请输入稀疏矩阵的行数列数非零元素的个数:n);/矩阵行数,列数下标均从开始;scanf(%d%d%d”,&m.mu,&m.nu,&m.tu);m.rhead=(olink *)malloc(m.mu+1)*sizeof(olink); 分配内存空间m.chead=(olink *)malloc(m.nu+1)*sizeof(oli

36、nk);/ 分配内存空间for( i=1;i=m.mu;i+)m.rheadi=null;把矩阵每个元素置空值for( i=1;i=m.nu;i+)m.cheadi=null;while(ti=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-right&q-right-jright;p-right=q-right;q-right=p;if(m.cheadj=null|m.cheadj-ii)p-down=m.cheadj;m.cheadj=p; else

37、q=m.cheadj;while(q-down&q-down-idown;p-down=q-down;q-down=p;t+;/创建十字链表void turnsmatrix_ol(crosslist m,crosslist &t)/* int i,j;t.nu=m.mu;t.mu=m.nu;t.tu=m.tu;t.rhead=(olink *)malloc(t.mu+1)*sizeof(olink); 分配内存空间t.chead=(olink *)malloc(t.nu+1)*sizeof(olink); 分配内存空间for(int i=1;i=t.mu;i+) t.rheadi=null;f

38、or(int j=1;j=t.nu;j+) t.cheadj=null;for(j=1;i=m.mu;j+)for(i=1;ji=m.cheadi-j;t.rheadi-j=m.cheadi-i;t.rheadi-e=m.cheadi-e;*/十字链表转置int smatrix_add(crosslist *a,crosslist *b)olnode *pa,*pb,*pre,*p,*cp100;定义 olnode 类型的变量int i,j,t;t=a-tu+b-tu;for(j=1;jnu;j+)cpj=a-cheadj;/ 将 a 矩阵的列表头指针赋给 cp 数组 for(i=1;imu;

39、i+) pa=a-rheadi;pb=b-rheadi;/将a, b矩阵的行表头指针分别赋给pa, pb pre=null; while(pb)/当pb不等于零if(pa=null|pa-jpb-j)p=(olink)malloc(sizeof(olnode);/ 给 p 动态分配空间 if(!pre)a-rheadi=p;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;如果a-cheadp-j不等于零,则把p赋给它及cpp-jelse

40、cpp-j-down=p;cpp-j=p;pb=pb-right;/否则把p赋给cpp-jelse 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=pa;pa=pa-right;if(a-cheadp-j=p)a-cheadp-j=cpp-j=p-down;else cpp-j-down=p-down;free(p);pb=pb-righ

41、t;a-mu=a-mub-mu?a-mu:b-mu;a-nu=a-nub-nu?a-nu:b-nu;/a 的行与列为 a及b当中较大的一个 return 1;/十字链表相加 int multsmatrix_ol(crosslist m, crosslist n, crosslist &q).int i, j, e;中间变量olink p0, q0, p, pl, pla;中间变量if(m.nu != n.mu)/检查稀疏矩阵m的列数和n的行数是否对应相等printf (稀疏夕!阵a的列数和b的行数不相等,不能相乘。n);return 0;q.mu = m.mu, q.nu = n.nu, q.

42、tu = 0;if(!(q.rhead = (olink *)malloc(q.mu + 1) * sizeof(olink) exit(-2);if(!(q.chead = (olink *)malloc(q.nu + 1) * sizeof(olink) exit(-2);for(i = 1; i = q.mu; i+) q.rheadi = null;for(i = 1; i = q.nu; i+) q.cheadi = null;/相乘for(i =1; i = q.mu; i+)for(j = 1; j j q0-i) q0 = q0-down; /m 的列大于 n 的行,则n的列指

43、针后移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)/乘积不为if(!(p = (olink)malloc(sizeof(olnode) 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 为该行的第个结点

44、q.rheadi = pl = p;/p 插在该行的表头且pl指向p(该行的最后一个结点)else pl-right = p, pl = p;/插在 pl 所指结点之后,pl右移/列插入if(q.cheadj = null)/若 p 为该列的第一个结点q.cheadj = p;该列的表头指向p else /插在列表尾pla = q.cheadj;/pla指向j行的第个结点while(pla-down) pla = pla-down;/pla 指向 j 行 最后一个结点pla-down = p; 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-right; return 1; /十字链表显示/主函数void main() int n,i;tsmatrix m,t,s;crosslist mm,tt,ss;printf(*稀疏矩阵的应用 *n);printf(n1 :用三元组创建稀疏矩阵n2:用十字链表创建稀疏矩阵n3:退出程序);print

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论