这道题和实验里面的一道题很像,详见我的博客稀疏矩阵的加法。
这道题实现两个矩阵的加法。笔者采用了结构体数组的定义形式存储矩阵。同时需要注意输出时候的顺序,还有当加和后的结果为零时删除这个节点。要说的都在注释里,话不多说上代码:
#include<stdio.h>
#include <stdlib.h>
#define ok 1
#define error 0
#define max 1000
typedef struct
{
int hang;
int lie;
int data;
}seq;
typedef struct
{
seq a[max];
}ju;
void creat( ju *l,int m,int n,int t)//创建一个m行n列的矩阵,输入t个元素
{
for (int i=0;i<t;i++)
{
int a,b,c;
scanf("%d",&a);
scanf("%d",&b);
scanf("%d",&c);
l->a[i].hang=a;
l->a[i].lie=b;
l->a[i].data=c;
}
}
void add(ju *l,ju *m,ju *n,int *t1,int *t2)//将矩阵lm加和放到n中,两矩阵里面元素个数分别为t1t2
{
for(int i=0;i<*t1;i++)//先把l拷贝到n
{
n->a[i].hang=l->a[i].hang;
n->a[i].lie=l->a[i].lie;
n->a[i].data=l->a[i].data;
}
for(int i=0;i<*t2;i++)//遍历m每一个元素
{
for(int j=0;j<*t1;j++)//查找n里面有没有和它位置相同的元素
{
if(n->a[j].hang==m->a[i].hang&&n->a[j].lie==m->a[i].lie)//位置相同的元素直接相加
{
n->a[j].data=n->a[j].data+m->a[i].data;
for(int k=i;k<*t2;k++)//位置重叠的元素在m里删除
{
m->a[k].hang=m->a[k+1].hang;
m->a[k].lie=m->a[k+1].lie;
m->a[k].data=m->a[k+1].data;
}
(*t2)--;
i--;
break;
}
}
}
int e=*t1;
for(int i=0;i<*t2;i++)//不重叠的元素直接输入到n后
{
n->a[e].hang=m->a[i].hang;
n->a[e].lie=m->a[i].lie;
n->a[e].data=m->a[i].data;
e++;
}
int t;//冒泡的中间变量
for(int i=0;i<*t1+*t2-1;i++)//冒泡
for(int j=0;j<*t1+*t2-1-i;j++)
if((n->a[j].hang>n->a[j+1].hang)||(n->a[j].hang==n->a[j+1].hang&&n->a[j].lie>n->a[j+1].lie))
{
t=n->a[j].hang,n->a[j].hang=n->a[j+1].hang,n->a[j+1].hang=t;
t=n->a[j].lie,n->a[j].lie=n->a[j+1].lie,n->a[j+1].lie=t;
t=n->a[j].data,n->a[j].data=n->a[j+1].data,n->a[j+1].data=t;
}
int q=*t1+*t2;
for(int i=0;i<q;i++)
{
if(n->a[i].data==0) //等于0的元素删除
{
for(int k=i;k<q;k++)
{
n->a[k].hang=n->a[k+1].hang;
n->a[k].lie=n->a[k+1].lie;
n->a[k].data=n->a[k+1].data;
}
(*t2)--;
q--;
}
}
}
void shuchu(ju *n,int j)//矩阵输出.j个元素
{
for(int i=0;i<j;i++)
{
printf("%d ",n->a[i].hang);
printf("%d ",n->a[i].lie);
printf("%d ",n->a[i].data);
printf("\n");
}
}
int main()
{
int m=10,n=10,k1,k2;//默认行列最大为10
scanf("%d%d",&k1,&k2);
ju *l,*k,*o;
l=(ju*)malloc(sizeof(ju));
k=(ju*)malloc(sizeof(ju));
o=(ju*)malloc(sizeof(ju));
creat(l,m,n,k1);
creat(k,m,n,k2);
add(l,k,o,&k1,&k2);
shuchu(o,k1+k2);
return 0;
}