稀疏矩阵乘法详解,两个稀疏矩阵相加的算法
十字链表矩阵相乘两个十字链表的矩阵相乘。
矩阵的输入
先需要输入矩阵的行数、列数、非0个数在输入非零数的坐标和数值第一个矩阵:矩阵的显示比较粗糙,自己有需求自己改一下吧。
第二个矩阵:
结果:
结果输出不是矩阵,自己需要可以自己改一下结果显示形式,我就这样显示了。
这个代码实在开发C上实现的,这个看一下自己的环境,一般都没什么问题。包含标准视频
#包含字符串。h
#包含标准库
#包含马洛克
#定义确定一
#定义溢出0
#定义错误-1
数据类型
整型状态;
数据类型说明结构奥尔节点
{
int i,j;
elem型;
结构OLNode *右,*下
}OLNode,* OLink
数据类型说明结构{
OLink *rhead,* chead
int mu,nu,tu;
}交叉列表
状态创建矩阵_ OL(交叉列表M)
{
int m,n,t,c=0;
int i,j,e;
(同Internationalorganizations)国际组织计数;
OLink p,q;
printf(稀疏矩阵的行数、列数、非零元个数:\ n’);
scanf(%d%d%d ,m,n,
m=m;
m。nu=n;
m。tu=t;
if(m ^ 1 n ^ 1 t m * n){
printf(该对象不符合矩阵要求);}
否则{
如果(!(m . rhead=(OLink *)malloc((m 1)* sizeof(OLink))))exit(溢出);
如果(!(m . chead=(olink *)malloc((n ^ 1)* sizeof(olink))))exit(溢出);
for(I=0;I I)m rhead[I]=NULL;
for(j=0;j j)m . chead[j]=NULL;
printf(请依次输入元素行数、列数、权值:\ n’);
for(count=0;计数计数)
{ c=计数1;
printf(请输入第%d元素的关键信息:’,c);
scanf(%d%d%d ,I,j,
如果(!(p=(ol node *)malloc(sizeof(ol node)))exit(溢出);
噗噗噗
if(m . rhead[I]==NULL m . rhead[I]-j j){ p-right=m . rhead[I];m . rhead[I]=p;}
否则{
for(q=m . rhead[I];(问-右)(q-右- j q=q-右);
p右=q右;q-right=p;//rhead是列数组
}
if(m . chead[j]==NULL m . chead[j]-I I){ p-down=m . chead[j];m . chead[j]=p;}
否则{
for(q=m . chead[j];(q-down)q-down-I q=q-down);
p下=q下;q-down=p;//chead是行数组
}
}
}
退货ok;
}
状态初始化_OL(OLink l)
{
如果(!(l=(ol node *)malloc(sizeof(ol node)))exit(溢出);
}
状态初始化_S(交叉列表一,交叉列表b,交叉列表M)//初始化矩阵c
{ int m,n;
int i,j;
m=a;
m=单位面积
m。nu=b . nu
n=B.nu
如果(!(m . rhead=(OLink *)malloc((m 1)* sizeof(OLink))))exit(溢出);
如果(!(m . chead=(olink *)malloc((n ^ 1)* sizeof(olink))))exit(溢出);
for(I=0;I I)m rhead[I]=NULL;
for(I=0;I I)m . chead[I]=NULL;
退货ok;
}
状态创建矩阵(交叉列表m,链接l)
{
int i,j,e;
OLink p,q;
我=l-
j=l-
e=l-
如果(!(p=(ol node *)malloc(sizeof(ol node)))exit(溢出);
p-p-p-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;}
否则{
for(q=m . rhead[I];(问-右)(q-右- j q=q-右);
p右=q右;q-right=p;//rhead是列数组
}
if(m . chead[j]==NULL m . chead[j]-I I){ p-down=m . chead[j];m . chead[j]=p;}
否则{
for(q=m . chead[j];(q-down)q-down-I q=q-down);
p下=q下;q-down=p;//chead是行数组
}
退货ok;
}
int PrintSMatrix(CrossList M)
{
int i,j;
OLink p;
if(m1 m nu 1){ printf(矩阵为空矩阵或者是非正常矩阵\ n’);
}
否则{
for(j=1;j=M.muj)
{
p=m . rhead[j];
while(p)
{
printf(第%d行%d列值为:%d\n ,p- i,p- j,p-
p=p-右;
}
}
}
退货ok;
}
国际拉姆乙(交叉表一,交叉表b,交叉表c)
{
OLNode * q=空,* L=空
OLink S;
int i,j,num
初始化_ OL(S);
s-down=NULL;
s-right=NULL;
if(A.nu==B.mu){
初始化_S(甲、乙、丙);
for(I=1;I=c我)
for(j=1;j=C.nuj)
{ num=0;
q=a . rhead[I];
l=b . chead[j];
而((q!=NULL) (L!=NULL))
{if(q- j==L- i){num=q- e*L-
q=q-右;L=L-向下;
}
else if(q- j L- i)
{
for(;我!=NULLL=L-向下)
{
如果(q- j=L- i)破;}}
其他
{ for(;q!=NULLq=q-右)
{
如果(q- j=L- i)破;
}}
} printf(%d ,num);
如果(num!=0)
{
表示"上帝的": sblood
表示"上帝的": sblood
s-e=num
创建矩阵(C,S);
}
否则;}
}
否则{
printf(\n矩阵无法相乘\ n’);
}
}
int main()
{
交叉列表甲、乙、丙;
OLink p,q,l;
(同Internationalorganizations)国际组织数据;
printf(请依次输入第一个\ n’);
create matrix _ OL(A);
printf( \ n这个矩阵是%d*%d \n ,A.mu,A.nu 的矩阵);
prints matrix(A);
printf( \ n请依次输入第二个\ n );
create matrix _ OL(B);
printf( \ n这个矩阵是%d*%d \n ,B.mu,B.nu 的矩阵);
prints matrix(B);
printf( \ n矩阵乘法结果:);
拉姆_B(A,B,C);
printf( \ n这个矩阵是%d*%d \n ,C.mu,C.nu 的矩阵);
prints matrix(C);
Printf(做个推荐很有用!);
系统(“暂停”);
返回0;
}
来自头发没了的,
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。