以十字链表为存储结构,编写程序,将稀疏矩阵B加到稀疏矩阵A上。第一行输入四个正整数,分别为稀疏矩阵A和稀疏矩阵B的行数m、列数n、稀疏矩阵A的非零元素个数t1和稀疏矩阵B的非零元素个数t2。接下来的t1+t2行三元组表示,其中第一个元素表示非零元素所在的行值,第二个元素表示非零元素所在的列值,第三个元素表示非零元素的值。输出相加后的矩阵三元组。3 4 3 21 1 11 3 12 2 21 2 12 2 31 1 11 2 11 3 12 2 5#include
#include
typedef struct olnode
{
int row,col,num;
struct olnode *down,*right;
}olnode,*olink;
typedef struct crosslist
{
int mu,nu,tu;
olnode *rhead[100],*chead[100];
}crosslist;
void init(crosslist *M)
{
int m, n,t1,i;//输入行列数,以及每个矩阵的非零元素数
scanf("%d%d%d",&m,&n,&t1);
M->mu = m;
M->nu = n;
M->tu = t1;
for(i = 1;i <= m;i++)
{
M->rhead[i] = NULL;
}
for(i = 1;i <= n;i++)
{
M->chead[i] = NULL;
}
}
void add(crosslist *M)
{
int i,m,n,e,t2;
olink p,q;
scanf("%d",&t2);
for(i=1;i<=M->tu;i++)
{
p=(olink)malloc(sizeof(olnode));
scanf("%d%d%d",&m,&n,&e);
p->row=m;
p->col=n;
p->num=e;
//插入到头节点之后
if(M->rhead[m] == NULL||M->rhead[m]->col > n)//节点在矩阵之外的情况
{
p->right = M->rhead[m];
M->rhead[m] = p;
}
else
{
for(q = M->chead[n];(q->down)&&q->down->col < n;q = q->down);
p->down = q->down;
q->down = p;
}
}
int flag = 0;
for(i = 0;i < t2;i++)
{
scanf("%d%d%d",&m,&n,&e);
for(q = M->rhead[m];q;q = q->right)
{
if(q->col == n)
{
q->num = e + q->num;
flag = 1;
break;
}
}
if(flag == 0)
{
olink p = (olink )malloc(sizeof(olnode));
p->row=m;
p->col=n;
p->num=e;
if(M->rhead[m] == NULL||M->rhead[m]->col > n)//插入到头节点之后
{
p->right = M->rhead[m];
M->rhead[m] = p;
}
else
{
for(q = M->rhead[m];(q->right)&&q->right->col < n;q = q->right);
p->right = q->right;
q->right = p;
}
}
flag = 0;
}
}
void getout(crosslist* a)
{
olink p;
int i;
for(i = 1;i <= a->mu;i++)
{
if(a->rhead[i] == NULL)
{
continue;
}
else
{
p = a->rhead[i];
while(p)
{
if(p->num == 0)
{
p = p->right;//注意会陷入死循环;
continue;
}
printf("%d %d %d
",p->row,p->col,p->num);
p = p->right;
}
}
}
}
int main()
{
crosslist *a;
a = (crosslist* )malloc(sizeof(crosslist));
init(a);
add(a);
getout(a);
return 0;
}