C++使用指针实现三元组表示的矩阵相加时的问题

来源:百度知道 编辑:UC知道 时间:2024/06/22 20:33:18
部分程序如下:

Status AddSMarix( TSMarix M, TSMarix N, TSMarix &AddQ ) //已知矩阵M与N行列相等,求和
{
if (M.row != N.row || M.column != N.column) return ERROR;
AddQ.row = M.row;
AddQ.column = M.column;
AddQ.number = 0;
Triple *pm, *pn;

pm = &M.data[1];
pn = &N.data[1];

while( pm != &M.data[M.number+1] && pn != &N.data[N.number+1] )
{
if (pm->i < pn->i || pm->i == pn->i && pm->j < pn->j || pn != &N.data[N.number+1] )
{
++ AddQ.number;
AddQ.data[ AddQ.number].e = pm->e;
AddQ.data[ AddQ.number].i = pm->i;
AddQ.data[ AddQ.number].j = pm->j;
pm ++ ;
}
else if (pm->i > pn->i || pm->i == pn->i && pm->j > pn->j || pm != &M.data[M.number+1])
{
++ AddQ.number;
AddQ.data[ AddQ.number].i = pn->i;
AddQ.data[ AddQ.number].j = pn->j;
AddQ.data[ AddQ.number].e =

while( pm != &M.data[M.number+1] && pn != &N.data[N.number+1] )
中的条件既然保证了pm,pn的判断条件
前两个个if中的
|| pn != &N.data[N.number+1]
|| pm != &M.data[M.number+1]
就无需再判断了,一定要去掉,否则第一个if会一直满足条件,直到将M的所有元素存入AddQ中,循环也终止了,相当于只是实现了将M中的元素复制到AddQ中的功能,是错误的。

while 循环中为什么当pm和pn指向的元素的行号和列号不同时,也将数据存入AddQ呢,这样最后的AddQ中除了M和N的元素的和,还存储了M和N各自的元素,即前两个if为什么还要往AddQ中记录数据呢?难道不只是记录矩阵M和N的对应非零元素的和吗,还要把原始矩阵M和N的元素一起记录吗

如果楼主是想在记录M和N的和的同时,也把M和N的元素记录到AddQ中,就会有不确定的情况发生,因为当循环到某步,pm和pn指向的元素的i和j相同了,pm和pn都增1,均指向下一个元素,若二者的i和j又恰好相同,则此时就不会执行前两个if,此时的M和N的这两个元素就不会存到AddQ中。

极端一下:给个例子,M和N三元组输入顺序如下,(行 列 数据)
M: (1 1 1) (1 2 2) (2 1 3) (2 2 3)
N: (1 2 3) (2 1 4) (2 2 5) (1 1 6)
pm初始指向(1 1 1),pn指向(1 2 3)
判断后(1 1 1) 存入到AddQ中
然后pm++,指向(1 2 2),pn未变
此时行列号匹配,相加存入到AddQ下一个空间,两个元素未存入AddQ
pm++,pn++
pm(2 1 3)pn(2 1 4)仍匹配,相加存入,两个元素未存入AddQ
pm++,pn++
pm(2 2 3)pn(2 2 5)仍匹配,相加存入 ,两个元素未存入AddQ
pm++,pn++
pm此时已经等于&M.data[M.numb