Description
以十字链表为存储结构,编写程序,将稀疏矩阵B加到稀疏矩阵A上。
Input
第一行输入四个正整数,分别为稀疏矩阵A和稀疏矩阵B的行数m、列数n、稀疏矩阵A的非零元素个数t1和稀疏矩阵B的非零元素个数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>
#define MAXSIZE 100
typedef struct OLNode{
int i,j;
int e;
OLNode *right,*down;
}OLNode,*OLink;
typedef struct
{
OLink *rHead, *cHead;
int mu,nu,tu;//行、列、非零元个数
}CrossList;
void init(CrossList *M)
{
int m,n,t1;
scanf("%d %d %d",&m,&n,&t1);
M->mu=m;
M->nu=n;
M->tu=t1;
M->rHead = (OLink *)malloc((m+1) * sizeof(OLink));
M->cHead = (OLink *)malloc((n+1) * sizeof(OLink));
int i;
for(i=1;i<=m;i++)
{
M->rHead[i] = NULL;
}
for(i=1;i<=n;i++)
{
M->cHead[i] = NULL;
}
}
void Create(CrossList *M)
{
int i,m,n,k,t2;
scanf("%d",&t2);
OLNode *q;
for(i = 1;i <= M->tu;i++)
{
OLNode* p = (OLNode* )malloc(sizeof(OLNode));
scanf("%d %d %d",&m,&n,&k);
p->i = m;
p->j =n;
p->e = k;
if(M->rHead[m] == NULL||M->rHead[m]->j > n)
{
p->right = M->rHead[m];
M->rHead[m] = p;
}
else
{
for(q = M->rHead[m];(q->right)&&q->right->j < n;q = q->right);
p->right = q->right;
q->right = p;
}
if(M->cHead[n] == NULL || M->cHead[n]->i > m)
{
p->down = M->cHead[n];
M->cHead[n] = p;
}
else
{
for(q = M->cHead[n];(q->down)&&q->down->i < m;q = q->down);
p->down = q->down;
q->down = p;
}
}
int flag = 0;
for(i = 1;i <= t2;i++)
{
scanf("%d %d %d",&m,&n,&k);
for(q = M->rHead[m];q;q = q->right)
{
if(q->j == n)
{
q->e += k;
flag = 1;
break;
}
}
if(flag == 0)
{
OLNode* p = (OLNode* )malloc(sizeof(OLNode));
p->i = m;p->j = n;p->e = k;
if(M->rHead[m] == NULL||M->rHead[m]->j > n)
{
p->right = M->rHead[m];
M->rHead[m] = p;
}
else
{
for(q = M->rHead[m];(q->right)&&q->right->j < n;q = q->right);//分号的作用是空循环,直接找到应该插入的位置
p->right = q->right;
q->right = p;
}
if(M->cHead[n] == NULL || M->cHead[n]->i > m)
{
p->down = M->cHead[n];
M->cHead[n] = p;
}
else
{
for(q = M->cHead[n];(q->down)&&q->down->i < m;q = q->down);
p->down = q->down;
q->down = p;
}
}
flag = 0;
}
}
int main()
{
CrossList *A;
A=(CrossList*)malloc(sizeof(CrossList));
init(A);
Create(A);
int i;
OLink p;
for(i=1;i<=A->mu;i++)
{
if(A->rHead[i] == NULL)
{
continue;
}
else
{
p = A->rHead[i];
while(p)
{
if(p->e == 0)
{
p = p->right;
continue;
}
printf("%d %d %d\n",p->i,p->j,p->e);
p = p->right;
}
}
}
return 0;
}