[NOJ]数据结构 NO.13以十字链表为存储结构实现矩阵相加
#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 init(CrossList *M,int m,int n,int t) //矩阵A初始化
{
M->m=m;M->n=n;M->len=t;
M->rhead=(OLink*)malloc(sizeof(OLink)*(m+1));
M->chead=(OLink*)malloc(sizeof(OLink)*(n+1));
int i,j,e,k;
OLNode *q;
for(i=1;i<=m;i++) M->rhead[i]=NULL;
for(i=1;i<=n;i++) M->chead[i]=NULL;
for(k=1;k<=t;k++)
{
OLNode* p=(OLNode*)malloc(sizeof(OLNode));
scanf("%d %d %d",&i,&j,&e);
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 add(CrossList *M,int t) //矩阵相加
{
int i,j,e,k,flag=0;
OLNode *q;
for(k=1;k<=t;k++)
{
scanf("%d %d %d",&i,&j,&e);
for(q=M->rhead[i];q;q=q->right)
{
if(q->col==j)
{
q->value+=e;
flag=1;
break;
}
}
if(flag==0)
{
OLNode* p=(OLNode*)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;
}
}
flag=0;
}
}
int main()
{
CrossList *A;
A=(CrossList*)malloc(sizeof(CrossList));
int m,n,t1,t2;
scanf("%d %d %d %d",&m,&n,&t1,&t2);
init(A,m,n,t1);
add(A,t2);
int i;
OLNode* p;
for(i=1;i<=A->m;i++)
{
if(A->rhead[i]==NULL) continue;
else
{
p=A->rhead[i];
while(p)
{
if(p->value!=0)
{
printf("%d %d %d\n",p->row,p->col,p->value);
}
p=p->right;
}
}
}
return 0;
}