[NOJ]数据结构实验2.4 稀疏矩阵的乘法
#include<stdio.h>
#include<stdlib.h>
typedef struct OLNode
{
int row,col;
int value;
struct OLNode *right,*down;
}OLNode,*OLink;
typedef struct
{
OLink *rhead,*chead;
int m,n,len;
}CrossList;
void enter(CrossList *M,int i,int j,int e) //将元素插入十字链表
{
OLink q;
OLink p=(OLink)malloc(sizeof(OLNode));
p->row=i;p->col=j;p->value=e;
if(M->rhead[i]==NULL||M->rhead[i]->col>j){
p->right=M->rhead[i];
M->rhead[i]=p;
}
else{
q=M->rhead[i];
while(q->right&&q->right->col<j) q=q->right;
p->right=q->right;
q->right=p;
}
if(M->chead[j]==NULL||M->chead[j]->row>i){
p->down=M->chead[j];
M->chead[j]=p;
}
else{
q=M->chead[j];
while(q->down&&q->down->row<i) q=q->down;
p->down=q->down;
q->down=p;
}
}
void init(CrossList *M) //矩阵初始化
{
scanf("%d %d",&M->m,&M->n);
M->rhead=(OLink*)malloc(sizeof(OLink)*(M->m+1));
M->chead=(OLink*)malloc(sizeof(OLink)*(M->n+1));
int i,j,e,k;
OLink q;
for(k=1;k<=M->m;k++) M->rhead[k]=NULL;
for(k=1;k<=M->n;k++) M->chead[k]=NULL;
for(scanf("%d %d %d",&i,&j,&e);i!=0;scanf("%d %d %d",&i,&j,&e))
{
enter(M,i,j,e);
}
}
void mul(CrossList*A,CrossList*B,CrossList*C) //矩阵相乘
{
C->rhead=(OLink*)malloc(sizeof(OLink)*(A->m+1));
C->chead=(OLink*)malloc(sizeof(OLink)*(B->n+1));
C->m=A->m;C->n=B->n;
int i,j,e,k;
OLink q,p;
for(k=1;k<=C->m;k++) C->rhead[k]=NULL;
for(k=1;k<=C->n;k++) C->chead[k]=NULL;
for(i=1;i<=A->m;i++)
{
for(j=1;j<=B->n;j++)
{
e=0;
p=A->rhead[i];
q=B->chead[j];
while(p&&q)
{
if(p->col==q->row)
{
e+=p->value*q->value;
p=p->right;
q=q->down;
}
else if(p->col<q->row) p=p->right;
else q=q->down;
}
if(e)
{
enter(C,i,j,e);
}
//printf("%d ",e);
}
}
}
int main()
{
CrossList *A,*B,*C;
A=(CrossList*)malloc(sizeof(CrossList));
init(A);
B=(CrossList*)malloc(sizeof(CrossList));
init(B);
C=(CrossList*)malloc(sizeof(CrossList));
mul(A,B,C);
OLink p;
int i;
for(i=1;i<=C->m;i++) //结果输出
{
p=C->rhead[i];
while(p)
{
printf("%d %d %d\n",p->row,p->col,p->value);
p=p->right;
}
}
return 0;
}