问答题 假设稀疏矩阵只存放其非0元素的行号、列号和数值,以一维数组顺次存放,行号-1作结束标志。例如,如下所示的稀疏矩阵M,存放在一维数组D中,D的元素如下:D[0]=0,D[1]=0,D[2]=1,D[3]=0,D[4]=4,D[5]=10,D[6]=2,D[7]=8,D[8]=5,D[9]=-1。
【正确答案】依题意,本题采用了一个稀疏矩阵到一维数组之间的映射关系,在进行加法运算时,依次遍历A和B的行列值,且以行为主,当行列相同时,将第3个元素值相加产生的3个元素放入结果数组中,不相同时,将A或B的三个元素直接放入结果数组中。 实现本题功能代码如下: void matrixadd(int A[],int B[],int C[]) { int i=0,j=0,k=0,m; //i是A的下标,j是B的下标,k是C的下标,这些下标都是从0开始的 while(A[i]!=-1 && B[j]!=-1)//循环直到A或B均结束 { if(A[i]==B[j]) //行相等 { if(A[i+1]==B[j+1]) //且列相等 { m=A[i+2]+B[j+2]; if(m!=0) //结果值大于0时放入C中 { C[k]=A[i]; C[k+1]=A[i+1]; C[k+2]=m; k=k+3; } i=i+3;j=j+3; } else if(A[i+1]<B[j+1]) //A的列小于B的列,将A的3个元素直接放入C中 { C[k]=A[i]; C[k+1]=A[i+1]; C[k+2]=A[i+2]; k=k+3; i=i+3; } else //B的列小于A的列,将B的3个元素直接放入C中 { C[k]=B[j]; C[k+1]=B[j+1]; C[k+2]=B[j+2]; k=k+3; j=j+3; } } else if(A[i]<B[j]) //A的行小于B的行,将A的3个元素直接放入C中 { C[k]=A[i]; C[k+1]=A[i+1]; C[k+2]=A[i+2]; k=k+3; i=i+3; } else //B的行小于A的行,将B的3个元素直接放入C中 { C[k]=B[j]; C[k+1]=B[j+i]; C[k+2]=B[j+2]; k=k+3; j=j+3; } } //循环结束 if(A[i]==-1) //A结束,B还有元素,则将B的所有元素直接放入C中 while(B[j]!=-1) { C[k]=B[j]; C[k+1]=B[j+1]; C[k+2]=B[j+2]; k=k+3; j=j+3; } else //B结束,A还有元素,则将A的所有元素直接放入C中 while(A[i]!=-1) { C[k]=A[i]; C[k+1]=A[i+1]; C[k+2]=A[i+2]; k=k+3; i=i+3; } C[k]=-1; }
【答案解析】