数组-三元组表矩阵相加

114 阅读1分钟
void addTSMatrix(TSMatrix &A, TSMatrix &B, TSMatrix *C)
{
	int row_a, row_b,col_a, col_b, index_a, index_b, index_c;
	C->m = A.m;
	C->n = A.n;
	//同时遍历两个三元组,开始都为1,因为0位置未存元素,当A或者B中其一元素取完循环终止
	for(index_a=1,index_b=1,index_c=1;index_a<=A.len&&index_b<=B.len;)
	{
		row_a = A.data[index_a].row;//A矩阵元素的行号
		row_b = B.data[index_b].row;//B矩阵元素的行号
		col_a = A.data[index_a].col;//A矩阵元素的列号
		col_b = B.data[index_b].col;//B矩阵元素的列号
		//比较行数先判断是否来自同一行
		if(row_a>row_b)//B的行号小于A直接将B中元素加入C矩阵
		{
			//复制B到C
			C->data[index_c].row = B.data[index_b].row;
			C->data[index_c].col = B.data[index_b].col;
			C->data[index_c].e = B.data[index_b].e;
			index_b++;
			index_c++;
		}
		else if(row_a<row_b)//B的行号大于A直接将A中元素加入C矩阵
		{
			//复制A到C
			C->data[index_c].row = A.data[index_a].row;
			C->data[index_c].col = A.data[index_a].col;
			C->data[index_c].e = A.data[index_a].e;
			index_a++;
			index_c++;
		}
		else//行号相同时
		{
			if(col_a>col_b)//B的列号小于A直接将B中元素加入C矩阵
			{
				//复制B到C
				C->data[index_c].row = B.data[index_b].row;
				C->data[index_c].col = B.data[index_b].col;
				C->data[index_c].e = B.data[index_b].e;
				index_b++;
				index_c++;
			}
			else if(col_a<col_b)//B的列号小于A直接将B中元素加入C矩
			{
				//复制A到C
				C->data[index_c].row = A.data[index_a].row;
				C->data[index_c].col = A.data[index_a].col;
				C->data[index_c].e = A.data[index_a].e;
				index_a++;
				index_c++;
			}
			else//相等
			{
				//判断元素相加是否为零
				if((A.data[index_a].e+B.data[index_b].e))//相加不为零
				{
					C->data[index_c].row = A.data[index_a].row;
					C->data[index_c].col = A.data[index_a].col;
					C->data[index_c].e = A.data[index_a].e + B.data[index_b].e;
					index_c++;
				}
				//无论相加是否为零都执行
				index_a++;
				index_b++;
			}
		}
	}
	while (index_a <= A.len)//B取完A未取完
	{
		//将A中所剩元素依次加入到C中
		C->data[index_c].row = A.data[index_a].row;
		C->data[index_c].col = A.data[index_a].col;
		C->data[index_c].e = A.data[index_a].e;
		index_a++;
		index_c++;
	}
	while (index_b <= B.len)//A取完B未取完
	{
		//将A中所剩元素依次加入到C中
		C->data[index_c].row = B.data[index_b].row;
		C->data[index_c].col = B.data[index_b].col;
		C->data[index_c].e = B.data[index_b].e;
		index_b++;
		index_c++;
	}
	C->len = index_c - 1;//index_c是在执行完逻辑后加一的所以比实际上多1,因此C中元素的真实个数为index_c-1
}