两个稀疏矩阵的乘法算法的实现——十字链表矩阵相乘
2021/12/14 14:17:36
本文主要是介绍两个稀疏矩阵的乘法算法的实现——十字链表矩阵相乘,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
十字链表矩阵相乘
-
两个十字链表的矩阵相乘。
-
矩阵的输入
- 先需要输入矩阵的行数、列数、非0个数
- 在输入非零数的坐标和数值
第一个矩阵:矩阵的显示比较粗糙,自己有需求自己改一下吧。
第二个矩阵:
结果:
- 结果输出不是矩阵,自己需要可以自己改一下结果显示形式,我就这样显示了。
这个代码实在dev C++上实现的,这个看一下自己的环境,一般都没什么问题。
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <malloc.h> #define ok 1 #define overflow 0 #define error -1 typedef int ElemType; typedef int Status; typedef struct OLNode { int i,j; ElemType e; struct OLNode *right,*down; }OLNode, *OLink; typedef struct{ OLink *rhead,*chead; int mu,nu,tu; }CrossList; Status CreateSMatrix_OL(CrossList &M) { int m,n,t,c=0; int i,j,e; int count; OLink p,q; printf("稀疏矩阵的行数、列数、非零元个数:\n"); scanf("%d%d%d", &m, &n, &t); M.mu=m; M.nu=n; M.tu=t; if(m<1||n<1||t>m*n) { printf("该对象不符合矩阵要求");} else{ if(!(M.rhead=(OLink *)malloc((m+1)*sizeof(OLink)))) exit(overflow); if(!(M.chead=(OLink *)malloc((n+1)*sizeof(OLink)))) exit(overflow); for(i=0;i<=m;i++) M.rhead[i]=NULL; for(j=0;j<=n;j++) M.chead[j]=NULL; printf("请依次输入元素行数、列数、权值:\n"); for(count=0; count<t;count++) { c=count+1; printf("请输入第%d元素的关键信息:",c); scanf("%d%d%d", &i, &j, &e); if(!(p=(OLNode *)malloc(sizeof(OLNode)))) exit(overflow); p->i=i; p->j=j; p->e=e; if(M.rhead[i]==NULL||M.rhead[i]->j>j) {p->right=M.rhead[i]; M.rhead[i]=p;} else{ for(q=M.rhead[i];(q->right)&&(q->right->j<j);q=q->right); p->right=q->right; q->right=p; //rhead是列数组 } if(M.chead[j]==NULL||M.chead[j]->i>i) {p->down=M.chead[j]; M.chead[j]=p;} else{ for(q=M.chead[j];(q->down)&&q->down->i<i;q=q->down); p->down=q->down; q->down=p; //chead是行数组 } } } return ok; } Status Initalization_OL(OLink &l) { if(!(l=(OLNode *)malloc(sizeof(OLNode)))) exit(overflow); } Status Initalization_S(CrossList A,CrossList B,CrossList &M)//初始化矩阵c { int m,n; int i,j; M.mu=A.mu; m=A.mu; M.nu=B.nu; n=B.nu; if(!(M.rhead=(OLink *)malloc((m+1)*sizeof(OLink)))) exit(overflow); if(!(M.chead=(OLink *)malloc((n+1)*sizeof(OLink)))) exit(overflow); for(i=0;i<=m;i++) M.rhead[i]=NULL; for(i=0;i<=n;i++) M.chead[i]=NULL; return ok; } Status CreateSMatrix(CrossList &M,OLink &l) { int i,j,e; OLink p,q; i=l->i; j=l->j; e=l->e; if(!(p=(OLNode *)malloc(sizeof(OLNode)))) exit(overflow); p->i=i; p->j=j; p->e=e;p->down=NULL;p->right=NULL; if(M.rhead[i]==NULL||M.rhead[i]->j>j) {p->right=M.rhead[i]; M.rhead[i]=p;} else{ for(q=M.rhead[i];(q->right)&&(q->right->j<j);q=q->right); p->right=q->right; q->right=p; //rhead是列数组 } if(M.chead[j]==NULL||M.chead[j]->i>i) {p->down=M.chead[j]; M.chead[j]=p;} else{ for(q=M.chead[j];(q->down)&&q->down->i<i;q=q->down); p->down=q->down; q->down=p; //chead是行数组 } return ok; } int PrintSMatrix(CrossList M) { int i,j; OLink p; if(M.mu<1||M.nu<1){printf("矩阵为空矩阵或者是非正常矩阵\n"); } else{ for(j=1;j<=M.mu;j++) { p=M.rhead[j]; while(p) { printf("第%d行%d列值为:%d\n",p->i,p->j,p->e); p=p->right; } } } return ok; } int MulA_B(CrossList A,CrossList B,CrossList &C) { OLNode *q=NULL,*L=NULL; OLink S; int i,j,num; Initalization_OL(S); S->down=NULL; S->right=NULL; if(A.nu==B.mu){ Initalization_S(A,B,C); for(i=1;i<=C.mu;i++) for(j=1;j<=C.nu;j++) {num=0; q=A.rhead[i]; L=B.chead[j]; while((q!=NULL)&&(L!=NULL)) {if(q->j==L->i){num+=q->e*L->e; q=q->right;L=L->down; } else if(q->j>L->i) { for(;L!=NULL;L=L->down) { if(q->j<=L->i) break;}} else {for(;q!=NULL;q=q->right) { if(q->j>=L->i) break; }} } printf("%d ",num); if(num!=0) { S->i=i; S->j=j; S->e=num; CreateSMatrix(C,S); } else ;} } else{ printf("\n矩阵无法相乘\n"); } } int main() { CrossList A,B,C; OLink p,q,l; int data; printf("请依次输入第一个\n"); CreateSMatrix_OL(A); printf("\n该矩阵是%d*%d的矩阵\n",A.mu,A.nu); PrintSMatrix(A); printf("\n请依次输入第二个\n"); CreateSMatrix_OL(B); printf("\n该矩阵是%d*%d的矩阵\n",B.mu,B.nu); PrintSMatrix(B); printf("\n矩阵相乘的结果:"); MulA_B(A,B,C); printf("\n该矩阵是%d*%d的矩阵\n",C.mu,C.nu); PrintSMatrix(C); system("pause"); return 0; }
这篇关于两个稀疏矩阵的乘法算法的实现——十字链表矩阵相乘的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23Springboot应用的多环境打包入门
- 2024-11-23Springboot应用的生产发布入门教程
- 2024-11-23Python编程入门指南
- 2024-11-23Java创业入门:从零开始的编程之旅
- 2024-11-23Java创业入门:新手必读的Java编程与创业指南
- 2024-11-23Java对接阿里云智能语音服务入门详解
- 2024-11-23Java对接阿里云智能语音服务入门教程
- 2024-11-23JAVA对接阿里云智能语音服务入门教程
- 2024-11-23Java副业入门:初学者的简单教程
- 2024-11-23JAVA副业入门:初学者的实战指南