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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

用十字链表和一般方法分别实现稀疏矩阵的乘法和加法资料.docx

1、用十字链表和一般方法分别实现稀疏矩阵的乘法和加法资料#include#include#define Size 2501# define Size1 51typedef struct int i; int j; int e;/非零元的值triple; /定义三元组typedef struct triple dataSize+1;/矩阵中的元素 int ropsSize1+1;/ ropsi为第i行元素中的首非零元在data中的序号 int mu;/行数 int nu;/列数 int tu;/非零元数 juzhen;/定义矩阵typedef struct node/ 定义十字链表元素 int i,

2、j,e; struct node *right,*down;/ 该非零元所在行表和列表的后继元素 node,*link;typedef struct / 定义十字链表对象结构体 link *rhead,*chead;/行和列的头指针 int m,n,t;/ 系数矩阵的行数,列数,和非零元素个数 crosslist;void createcross(crosslist &M)/建立十字链表 int i,j,e,k; node *p,*q; printf(输入行,列和非零元数,空格隔开:n); scanf(%d %d %d,&M.m,&M.n,&M.t); M.rhead=(link *)mall

3、oc(M.m+1)*sizeof(link);/给行和列的头指针分配内存 M.chead=(link *)malloc(M.n+1)*sizeof(link); for(k=1;k=M.m;k+)/初始化行,列的头指针 M.rheadk=NULL; for(k=1;k=M.n;k+) M.cheadk=NULL; printf(输入非零元的行,列和值,空格隔开:n); for(k=1;ki=i; p-j=j; p-e=e; if(M.rheadi=NULL|M.rheadi-jj)/插入元素所在行无非零元或首非零元的列标大于插入元素的列标 p-right=M.rheadi; M.rheadi=

4、p; else for(q=M.rheadi;(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 for(q=M.cheadj;(q-down)&q-down-idown);/空循环找到第一个行标大于或等于插入元素行标的元素 p-down=q-down; q-down=p; void printcros

5、s(crosslist A)/输出十字链表 if(A.m=0) printf(十字链表为空!n); else printf(十字链表为:n); int i,j; for(i=1;i=A.m;i+) link p=A.rheadi; for(j=1;jj) printf(%5d,p-e); p=p-right; else printf(%5d,0); printf(n); printf(n); crosslist addcross() printf(十字链表加法:n); crosslist a,b;/ 创建两个十字链表对象,并初始化 createcross(a); createcross(b);

6、 node *pre,*h51,*pa,*pb,*q;/定义辅助指针,pa,pb分别为a,b当前比较的元素,pre为pa的前驱元素 int i,j,k=0,m,n; /hj指向j列的当前插入位置 if(a.m!=b.m|a.n!=b.n) printf(格式不对,不能相加!n); else for(i=1;i=a.m;i+) pa=a.rheadi; pb=b.rheadi; pre=NULL; for(j=1;ji=pb-i; p-j=pb-j; p-e=pb-e; if(pa=NULL|pa-jpb-j)/当a此行已经检查完或者pb因该放在pa前面 if (pre=NULL) a. rhe

7、adp-i=p; else pre-right=p; p-right=pa; pre=p; if (hp-j=NULL)/当前插入位置下面无非零元 /因为是逐行处理,so,hp-j,依次下移 /因此每次都是指向插入的位置 a. chead p-j= p; p-down = NULL; else p-down = hp-j-down; hp-j-down = p; hp-j=p;/*hp-j下移指向下次插入的位置 pb=pb-right;/pb指向该行下个元素 else if(pa&pa-jj)/只要移动pa的指针*先不加|(pb=NULL&pa) pre = pa; hpa-j=pa;/移动h

8、,使其指向下次插入的位置 pa = pa-right; else if(pa-j=pb-j) pa-e+=pb-e; if(pa-e)/不为零 pre=pa; hpa-j=pa; pb=pb-right;/加 else/pa-e为零,删除节点 if (pre =NULL) a.rhead pa-i=pa-right; else pre-right=pa-right; p=pa;/p指向pa,用来在下面修改列指针 pa=pa-right; if (h p-j=NULL) a.chead p-j=p-down; else hp-j-down=p-down; free(p); pb=pb-right

9、; return a;void multycross(crosslist &c)/十字链表乘法 node *p,*q,*u,*v,*p1,*p2; crosslist a,b; link *r; int i,j,k,e; printf(十字链表乘法:n); createcross(a); createcross(b); if(a.n!=b.m) printf(格式错误,不能相乘!n); else c.m=a.m; c.n=b.n; c.t=0; c.rhead=(link *)malloc(a.m+1)*sizeof(link);/给行和列的头指针分配内存 c.chead=(link *)ma

10、lloc(b.n+1)*sizeof(link); for(k=1;k=a.m;k+)/初始化行,列的头指针 c.rheadk=NULL; for(k=1;k=b.n;k+) c.cheadk=NULL; r=(link *)malloc(b.n+1)*sizeof(link); for(i=1;ie=0; u-i=0; u-j=0; for(k=1;k=b.n;k+)/初始化r rk=u; p1=p=a.rheadi; for(j=1;je=0; v-i=i; v-j=j; while(p&q) if(p-jq-i) q=q-down; else if(p-ji) p=p-right; el

11、se v-e+=p-e*q-e; p=p-right; q=q-down; if(v-e)/如果不为零,则插入c矩阵中 /同建立十字链表 if(c.rheadi=NULL|c.rheadi-jj)/插入元素所在行无非零元或首非零元的列标大于插入元素的列标 v-right=c.rheadi; c.rheadi=v; else for(p2=c.rheadi;(p2-right)&(p2-right-jright);/空循环找到第一个列标大于或等于插入元素列标的元素 v-right=p2-right; p2-right=v; if(c.cheadj=NULL|c.cheadj-ii)/插入元素所在

12、列无非零元或首非零元的行标大于插入元素的行标 v-down=c.cheadj; c.cheadj=v; else for(p2=c.cheadj;(p2-down)&(p2-down-idown);/空循环找到第一个行标大于或等于插入元素行标的元素 v-down=p2-down; p2-down=v; void create(juzhen & M) /创建稀疏矩阵 int i,t=0; printf(输入矩阵行数和列数and非零元的个数,以空格隔开:n); scanf(%d %d %d,&M.mu,&M.nu,&M.tu); printf(输入矩阵非零元的行,列,和数值(中间空格隔开):n);

13、 for(i=1;i=M.tu;i+) scanf(%d %d %d,&M.datai.i,&M.datai.j,&M.datai.e); /输入三元组的元素 for(i=1;i=Size1;i+)/初始化rops【】 M.ropsi=0; for(i=1,t=1;i=M.mu;i+)/得到各行第一个元素的序号 M.ropsi=t; while(M.datat.i=i&t=M.tu)/遇到i行非零元,则t累加 t+; void add(juzhen A,juzhen B,juzhen & C)/稀疏矩阵加法 int k=1,temp=0,k1=1, k2=1;/k1,k2,k分别控制A,B,C

14、中非零元的序号变化 printf(稀疏矩阵加法:n); create(A); create(B); if(A.mu!=B.mu|A.nu!=B.nu) printf(格式不对,不能相加!n); else while(k1=A.tu&k2=B.tu)/当A,B中的非零元都没用完 if(A.datak1.iB.datak2.i)/同上 C.datak+=B.datak2+; else/datak1,datak2行标相同 if(A.datak1.jB.datak2.j)/datak1列标大于datak2列标,则把datak2的值赋给datak C.datak+=B.datak2+; else if(

15、A.datak1.jB.datak2.j)/同上 C.datak+=A.datak1+; else /行,列标都相同 temp=0; temp=A.datak1.e+B.datak2.e; if(temp)/相加后不为零 C.datak.i=A.datak1.i; C.datak.j=A.datak1.j; C.datak.e=temp; k+; k1+; k2+; while(k1=A.tu)/B中非零元已用完,A中还有非零元 C.datak+=A.datak1+; while(k2=B.tu)/A中非零元已用完,B中还有非零元 C.datak+=B.datak2+; C.mu=A.mu;/

16、确定C的行列数和非零元个数 C.nu=A.nu; C.tu=k-1; void print(juzhen A)/输出稀疏矩阵 printf(n矩阵为:n); int i,j,k=1; if(A.mu=0) printf(矩阵为空!n); else if(A.tu=0)/矩阵元素为空 printf(零矩阵!n); else for(i=1;i=A.mu;i+)/逐行输出 for(j=1;j=A.nu;j+) if(A.datak.i=i&A.datak.j=j)/行和列分别对应相等则输出相应非零元,否则输出零 printf(%5d,A.datak+.e); else printf(%5d,0);

17、 printf(n);/该行输出结束,空行输出下一行 printf(n);void multy(juzhen A,juzhen B,juzhen &C)/稀疏矩阵乘法 int arow,brow,ccol,temp51,p,q,t,tp,i;/各变量代表含义见下面 printf(稀疏矩阵乘法:n); create(A); create(B); if(A.nu!=B.mu) printf(格式错误,不能相乘!n); else C.mu=A.mu;/初始化c的行列及非零元个数 C.nu=B.nu; C.tu=0; if(A.nu!=B.mu) printf(A,B格式不对不能相乘!n); else

18、 / for(arow=1;arow=A.mu;arow+)/arow为当前A矩阵的行标 for(i=0;i51;i+)/初始化temp tempi=0; if(arowA.mu) tp=A.ropsarow+1;/tp为arow+1行的首非零元在data【】中的序号 else /arow为最后一行 tp=A.tu+1; for(p=A.ropsarow;ptp;p+)/p为A中当前元素在data中的序号 brow=A.datap.j;/brow为 与B矩阵中的相应行对应的 A中当前元素的列标 if(browB.mu) t=B.ropsbrow+1;/t为brow+1行的首非零元在B中data

19、【】中的序号 else /brow大小等于B.mu t=B.tu+1; for(q=B.ropsbrow;qt;q+)/q为B中当前元素在B.data中的序号 ccol=B.dataq.j;/ccol:datap*dataq所得结果所在的列 tempccol+=A.datap.e*B.dataq.e;/temp【ccol】:相乘所得的C矩阵中第arow行cool列元素的值 for(ccol=1;ccol=B.nu;ccol+)/ if(tempccol)/temp【ccol】不为零,则把值赋到c中,c.tu加1。 C.data+C.tu.e=tempccol; C.dataC.tu.i=aro

20、w; C.dataC.tu.j=ccol; void clear(juzhen & A)/清空稀疏矩阵 int i; A.mu=0; A.nu=0; A.tu=0; for(i=0;iSize1+1;i+) A.ropsi=0; for(i=0;iSize+1;i+) A.datai.i=0; A.datai.j=0; A.datai.e=0; void main() juzhen A,B,C,D; crosslist a,b,c,d;lable: printf(*n); printf(请选择:1、稀疏矩阵的加法,并输出结果,2、稀疏矩阵乘法,并输出结果n); printf(n3、十字链表加法

21、,并输出,4、十字链表乘法并输出,5、结束:n); printf(*n); int x; scanf(%d,&x); switch(x) case 1: add(A,B,C); print(C); printf(n); goto lable; case 2: multy(A,B,C); print(C); printf(n); goto lable; case 3: a=addcross(); printcross(a); printf(n); goto lable; case 4: multycross(b); printcross(b); printf(n); goto lable; case 5: break; printf(n); /*乘法测试数据:矩阵原型:4 -3 0 0 1 3 0 0 24 -6 00 0 0 8 0 * -4 2 0 8 0 00 0 1 0 0 0 1 0 = 0 1 00 0 0 0 70 1 0 0 0 0 00 0 0 4 5 6 1 1 4 1 2 -3 1 5 1 2 4 8 3 3 1 4 5 70 5 3 5 1 1 3 2 1 -4 2 2 2 3 2 1 4 1 1 4 5 20 1 1 1 1 2 1 1 3 1 1 4 1 1 5

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

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