十字链表矩阵相乘

  • 两个十字链表的矩阵相乘。

  • 矩阵的输入

  • 先需要输入矩阵的行数、列数、非0个数
  • 在输入非零数的坐标和数值

第一个矩阵:矩阵的显示比较粗糙,自己有需求自己改一下吧。

两个稀疏矩阵的乘法算法的实现——十字链表矩阵相乘_#include

第二个矩阵:

两个稀疏矩阵的乘法算法的实现——十字链表矩阵相乘_C语言_02

结果:

  • 结果输出不是矩阵,自己需要可以自己改一下结果显示形式,我就这样显示了。
    两个稀疏矩阵的乘法算法的实现——十字链表矩阵相乘_C语言_03

这个代码实在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);
printf("有用点个推荐呗!");
system("pause");
return 0;
}