Description
输入两个稀疏矩阵,输出它们相加的结果。
Input
第一行输入四个正整数,分别是两个矩阵的行m、列n、第一个矩阵的非零元素的个数t1和第二个矩阵的非零元素的个数t2。
接下来的t1+t2行是三元组,分别是第一个矩阵的数据和第二个矩阵的数据。三元组的第一个元素表示行号,第二个元素表示列号,第三个元素是该项的值。
Output
输出相加后的矩阵三元组。
-
Sample Input
3 4 3 2 1 1 1 1 3 1 2 2 2 1 2 1 2 2 3
-
Sample Output
1 1 1 1 2 1 1 3 1 2 2 5
#include <stdio.h>
#include<stdlib.h>
typedef struct Node
{
int i,j;
int e;
struct Node *right,*down;
} Node,*LNode;
typedef struct Cross
{
LNode *rh,*ch;
int ra,ca,da;
} Cross, *LCross;
void init(LCross M)
{
int i;
M->rh = (LNode *)malloc((M->ra+1)*sizeof(LNode));
M->ch = (LNode *)malloc((M->ca+1)*sizeof(LNode));
for(i=1; i<=M->ra; i++)
{
M->rh[i]=NULL;
}
for(i=1; i<=M->ca; i++)
{
M->ch[i]=NULL;
}
}
void Create(LCross M)
{
int i;
LNode p,temp;
if(M->da != 0)
{
for(i=1; i<=M->da; i++)
{
p=(LNode)malloc(sizeof(Node));
scanf("%d %d %d",&p->i,&p->j,&p->e);
if(M->rh[p->i] == NULL)
{
p->right=NULL;
M->rh[p->i] = p;
}
else
{
for(temp=M->rh[p->i];; temp=temp->right)
{
if(temp->right == NULL)
{
temp->right = p;
p->right =NULL;
break;
}
else if(temp->j < p->j && temp->right->j>p->j)
{
p->right = temp->right;
temp->right = p;
break;
}
else if(temp==M->rh[p->i] && temp->j>p->j)
{
p->right = temp;
temp=p;
break;
}
}
}
if(M->ch[p->j] == NULL|| M->ch[p->j]->i>(p->i))
{
p->down=M->ch[p->j];
M->ch[p->j] = p;
}
else
{
for(temp=M->ch[p->j]; temp->down && temp->down->i<p->i; temp=temp->down);
p->down = temp->down;
temp->down = p;
}
}
}
}
void PlusToA(LCross A,LCross B)
{
int i;
LNode p,temp1,temp2;
for(i=1; i<=A->ra; i++)
{
if(B->rh[i] == NULL) continue;
else
{
if(A->rh[i] == NULL)
{
p=(LNode)malloc(sizeof(Node));
p->j = B->rh[i]->j;
p->i = B->rh[i]->i;
p->e = B->rh[i]->e;
A->rh[i]=p;
p->right = NULL;
B->rh[i]=B->rh[i]->right;
}
if(B->rh[i]==NULL)continue;
for(temp1=B->rh[i];; temp1=temp1->right)
{
for(temp2=A->rh[i];; temp2=temp2->right)
{
if(temp2->j == temp1->j)
{
temp2->e+=temp1->e;
break;
}
else if(temp2==A->rh[i] && temp1->j<temp2->j)
{
p=(LNode)malloc(sizeof(Node));
p->j = temp1->j;
p->i = temp1->i;
p->e = temp1->e;
p->right = temp2->right;
p->right =temp2;
A->rh[i]=p;
break;
}
else if((temp2->right == NULL || temp2->right->j>temp1->j) && temp1->j>temp2->j)
{
p=(LNode)malloc(sizeof(Node));
p->j = temp1->j;
p->i = temp1->i;
p->e = temp1->e;
p->right = temp2->right;
temp2->right=p;
break;
}
}
if(temp1->right == NULL) break;
}
}
}
}
void PrintCross(LCross A)
{
int i;
LNode p;
for(i=1; i<=A->ra; i++)
{
p=A->rh[i];
while(p!=NULL)
{
printf("%d %d %d\n",p->i,p->j,p->e);
p=p->right;
}
}
}
int main()
{
LCross A = (LCross)malloc(sizeof(Cross));
LCross B = (LCross)malloc(sizeof(Cross));
scanf("%d %d %d %d",&A->ra,&A->ca,&A->da,&B->da);
B->ra = A->ra;
B->ca = A->ca;
init(A);
init(B);
Create(A);
Create(B);
PlusToA(A,B);
PrintCross(A);
return 0;
}