大佬教程收集整理的这篇文章主要介绍了两个稀疏矩阵的乘法算法的实现——十字链表矩阵相乘,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
两个十字链表的矩阵相乘。
矩阵的输入
第一个矩阵:矩阵的显示比较粗糙,自己有需求自己改一下吧。
@H_675_26@
#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);
printf("有用点个推荐呗!");
system("pause");
return 0;
}
以上是大佬教程为你收集整理的两个稀疏矩阵的乘法算法的实现——十字链表矩阵相乘全部内容,希望文章能够帮你解决两个稀疏矩阵的乘法算法的实现——十字链表矩阵相乘所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。