实验2.3:稀疏矩阵加法,用十字链表实现C=A+B
Time Limit: 3000ms, Memory Limit: 10000KB , Accepted: 0, Total Submissions: 0
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 OLNode{
int row,col;
int num;
struct OLNode *right,*down;
}OLNode,*OLink;
typedef struct CrossList{
OLink rHead[100],cHead[100];
int ru,cu,tu;
}CrossList;
CrossList *M;
void init(CrossList *M,int cnt){
int x,y,z;
OLink r;
while(cnt--){
OLink q=(OLink)malloc(sizeof(OLNode));
scanf("%d%d%d",&x,&y,&z);
q->row=x;q->col=y;q->num=z;
if(M->rHead[x]==NULL||M->rHead[x]->col > y){
q->right=M->rHead[x]; M->rHead[x]=q;
}
else{
for(r=M->rHead[x];r->right && r->right->col < y;r=r->right);
q->right=r->right; r->right=q;
}//完成行插入
if(M->cHead[y]==NULL||M->cHead[y]->row > x){
q->down=M->cHead[y]; M->cHead[y]=q;
}
else{
for(r=M->cHead[y];r->down && r->down->row < x;r=r->down);
q->down=r->down; r->down=q;
}//完成列插入
}
}
void add(CrossList *M,int cnt){
OLink l;
int flag;
int i,x,y,z;
while(cnt--){
scanf("%d%d%d",&x,&y,&z);
OLink r=(OLink)malloc(sizeof(OLNode));
r->row=x; r->col=y; r->num=z;
flag=1;
for(l=M->rHead[x];l;l=l->right){
if(l->col == r->col){
l->num+=r->num;
flag=0; break;
}
}
if(flag){
if(M->rHead[x]==NULL){
r->right=M->rHead[x];
M->rHead[x]=r;
M->ru++;
}
else if(M->rHead[x]->col > y){
r->right=M->rHead[x];
M->rHead[x]=r;
}
else{
for(l=M->rHead[x];l->right && l->right->col < y;l=l->right);
r->right=l->right; l->right=r;
}
}
}
}
void output(CrossList *M){
int i;
OLink r,t;
for(i=1;i<=M->ru;i++){
if(M->rHead[i]){
for(t=M->rHead[i];t;t=t->right){
printf("%d %d %d\n",t->row,t->col,t->num);
}
}
}
}
int main(){
M=(CrossList *)malloc(sizeof(CrossList));
int m,n,t1,t2;
scanf("%d%d%d%d",&m,&n,&t1,&t2);
M->ru=m;M->cu=n;
int i;
for(i=1;i<=t1;i++){
M->cHead[i]=NULL;
M->rHead[i]=NULL;
}
init(M,t1);
add(M,t2);
output(M);
return 0;
}