本来想借用一下转置的一些思路,发现行不通。这道题看到的大部分解法应当是参考了链表归并排序的方法。总之是挨个比较接入,避免了单纯遍历的麻烦,相加的判断插入也更加便捷。
以下是需要解释的部分:
tsmatrix emptyTSMatrixr()
{
tsmatrix p;
p=(TSMatrix*)malloc(sizeof(TSMatrix));
p->nu=0;
p->mu=0;
p->tu=0;
return p;
}//归并链表p3的创建,p->tu需要置零;
void build(tsmatrix p)
{
int count,i,j,k;
for(count=0;count<p->tu;count++)
{
scanf("%d %d %d",&i,&j,&k);
p->data[count].row=i;
p->data[count].col=j;
p->data[count].info=k;
}
}//用于给链表p1,p2插入数据
void Insert(tsmatrix p3,int i,int j,int k,int num)
{
p3->data[num].row=i;
p3->data[num].col=j;
p3->data[num].info=k;
(p3->tu)++;//非零元计数
}//给p3里面归并的函数
void addTSMatrix(tsmatrix p1,tsmatrix p2,tsmatrix p3)
{
p3->mu=p1->mu;
p3->nu=p1->nu;//相加,行数列数必定一一相等,给哪个都一样
int num1=0;//p1的遍历初始化
int num2=0;//p2的遍历初始化
int num=0;
while((num1<p1->tu)&&(num2<p2->tu))//数量限制
{
/*以下的比较主要基于行,首先是各顾各,行列不完全相同的情况,各自独立插入,可以理解为0加上本身*/
if(p1->data[num1].row<p2->data[num2].row)//p1当前元素行小于p2的
{
Insert(p3,p1->data[num1].row,p1->data[num1].col,p1->data[num1].info,num);//插入p1中的这个元素
num1++;//右移,指向下一个
num++;
}
else if(p1->data[num1].row>p2->data[num2].row)//p1当前元素行小于p2的
{
Insert(p3,p2->data[num2].row,p2->data[num2].col,p2->data[num2].info,num);//插入p2中的这个元素
num2++;
num++;
}
else//即就是这两个元素行相等
{
/*下面是基于列的比较*/
if(p1->data[num1].col<p2->data[num2].col)//同样的,列小的先接入
{
Insert(p3,p1->data[num1].row,p1->data[num1].col,p1->data[num1].info,num);
num1++;
num++;
}
else if(p1->data[num1].col>p2->data[num2].col)
{
Insert(p3,p2->data[num2].row,p2->data[num2].col,p2->data[num2].info,num);
num2++;
num++;
}
else//行列相等,则需要p1,p2当前两个非零元素相加
{
if(p1->data[num1].info+p2->data[num2].info!=0)//如果不是零则插入
{
Insert(p3,p1->data[num1].row,p1->data[num1].col,p1->data[num1].info+p2->data[num2].info,num);
num1++;
num2++;
num++;
}
else//相加为零,此行此列唯有这两个元素相加,所以判断完后两者皆右移指向下一个非零元素
{
num1++;
num2++;
}
}
}
}
while(num2<p2->tu)//剩下的直接插入
{
Insert(p3,p2->data[num2].row,p2->data[num2].col,p2->data[num2].info,num);
num2++;
num++;
}
while(num1<p1->tu)
{
Insert(p3,p1->data[num1].row,p1->data[num1].col,p1->data[num1].info+p2->data[num2].info,num);
num1++;
num++;
}
}