for(i=1;i<=M.mu*N.nu;i++)
*(Qe+i)=0;/* 矩阵Q的第i行j列的元素值存于*(Qe+(M.data[i].i-1)*N.nu+N.data[j].j)中,初值为0 */ for(i=1;i<=M.tu;i++) /* 结果累加到Qe */ for(j=1;j<=N.tu;j++)
if(M.data[i].j==N.data[j].i)
*(Qe+(M.data[i].i-1)*N.nu+N.data[j].j)+=M.data[i].e*N.data[j].e;
for(i=1;i<=M.mu;i++) /*Qe矩阵中,因为M的每一行和N的每一列相乘都是T的一个元素,不管它是零或非零 */
for(j=1;j<=N.nu;j++) /*当M的第一行和N的第一列相乘则得T的第一个元素;当M的第一行和N的第二列相乘则得T的第二个元素;…… */
if(*(Qe+(i-1)*N.nu+j)!=0) /*……当M的第i行和N的第j列相乘则得T的第p个元素;根据归纳法得p=(i-1)*N的列数+j */
{
Qn++;//非零元个数加一
T->data[Qn].e=*(Qe+(i-1)*N.nu+j); T->data[Qn].i=i; T->data[Qn].j=j; }
free(Qe); T->tu=Qn; return ;
} main() { RLSMatrix M,N,Q;
char ch; printf(\ *************************** \\n\
printf(\ ** ** \\n\printf(\ ** 稀疏矩阵运算器 ** \\n\printf(\ ** --------------------- ** \\n\printf(\printf(\printf(\printf(\
*************************** \\n\ _____________________________________________________________________ \\n\ | 请选择 | \\n\ | A.加法 B.减法 C.乘法 D.转置 Y.继续运算 N.结束运算 | \\n\
printf(\ |_____________________________________________________________________| \\n\\n\
printf(\输入数字时请用逗号隔开!\\n\\n\
printf(\ ->\
scanf(\
while(ch!='N'){//进行循环运算
switch(ch){//进行运算选择 case'A':{ printf(\ 请输入要求和的两个矩阵:\\n\\n\
printf(\ 输入第一个矩阵:\\n\\n\
ScanRLSMatrix(&M);
printf(\ 输入的第一个矩阵为:\\n\\n\
PrintRLSMatrix(M);
printf(\ 输入第二个矩阵:\\n\\n\ ScanRLSMatrix(&N);
printf(\ 输入的第二个矩阵为:\\n\\n\ PrintRLSMatrix(N);
HeRLSMatrix(&M,&N,&Q);
printf(\ 两矩阵之和为:\\n\\n\ PrintRLSMatrix(Q);
printf(\ 是否继续运算(Y/N)?\\n\\n\ printf(\ ->\
ch=getchar(); };break;
case'B':{ printf(\ 请按次序输入要求差的两个矩阵:\\n\\n\ printf(\ 输入第一个矩阵:\\n\\n\
ScanRLSMatrix(&M);
printf(\ 输入的第一个矩阵为:\\n\\n\ PrintRLSMatrix(M);
printf(\ 输入第二个矩阵:\\n\\n\ ScanRLSMatrix(&N);
printf(\ 输入的第二个矩阵为:\\n\\n\ PrintRLSMatrix(N);
ChaRLSMatrix(&M,&N,&Q);
printf(\ 两矩阵之差为:\\n\\n\ PrintRLSMatrix(Q);
printf(\是否继续运算(Y/N)?\\n\\n\ printf(\ ->\ ch=getchar();
}break;
case'C':{printf(\ 请按次序输入要求积的两个矩阵:\\n\\n\ printf(\ 输入第一个矩阵:\\n\\n\
ScanRLSMatrix(&M);
printf(\ 输入的第一个矩阵为:\\n\\n\ PrintRLSMatrix(M);
printf(\ 输入第二个矩阵:\\n\\n\ ScanRLSMatrix(&N);
printf(\ 输入的第二个矩阵为:\\n\\n\ PrintRLSMatrix(N);
JiRLSMatrix(M,N,&Q);
printf(\ 两矩阵之积为:\\n\\n\ PrintRLSMatrix(Q);
printf(\是否继续运算(Y/N)?\\n\\n\ printf(\ ->\ ch=getchar(); }break;
case'D':{printf(\请输入要转置的矩阵:\\n\\n\
ScanRLSMatrix(&M); printf(\ 输入的要转置的矩阵为:\\n\\n\ PrintRLSMatrix(M);
FasttransposeRLSMatrix(M,&Q); printf(\转置矩阵为:\\n\\n\
PrintRLSMatrix(Q);
printf(\是否继续运算(Y/N)?\\n\\n\
printf(\ ->\
ch=getchar();
}break;
case'Y':{printf(\请选择运算\\n\ printf(\ ->\ ch=getchar();
}break;
default:printf(\
}
}
printf(\ 运算结束!\\n\\n\printf(\ \\1\\1\\1\\1\\1\\1\\1\\1\\1\\1\\1\\1\\1\\1\\1\\1\\1\\1\\1\\1\\1\\1
用!\\1\\1\\1\\1\\1\\1\\1\\1\\1\\1\\1\\1\\1\\1\\1\\1\\1\\1\\1\\1\\1\\1\\n\\n\getch(); }
谢
谢
使
开始 用户选择计算类型 键入A 加法运算 键入D 转置运算 显示结果 Y 继续计算 等待用户键入 N 结束运算