#include
#define MAXSIZE 12500//假设非零元个数的最大值为 12500
#define MAXRC 1000
typedef struct
{
//定义三元组
int r,c;//该非零元的行下标和列下标
int e;//该非零元的值
}Triple;
typedef struct
{
Triple data[MAXSIZE+1];//非零元三元组表,data[0]未用
int rpos[MAXRC+1];
int rows,cols,num;//矩阵的行数、列数和非零元个数 mu,nu,tu
}TSMatrix;
int prepare();//输入界面以及选择运算函数
int Read_data(TSMatrix *M);//读取矩阵并转换为三元组的函数
int TransposeSMatrix(TSMatrix M, TSMatrix *T);//矩阵的转置
int PlusSMatrix(TSMatrix M, TSMatrix N, TSMatrix *H);//矩阵的相加
int MinusSMatrix(TSMatrix M, TSMatrix N, TSMatrix *H);//矩阵的相减
int MultSMatrix(TSMatrix M, TSMatrix N, TSMatrix *Q);//矩阵的相乘
int print(TSMatrix T);//打印矩阵函数
int compare(int , int , int , int);//判断矩阵能否相加、相减、相乘的函数
int print(TSMatrix M);//打印矩阵函数
int main()//主函数
{
char ch,count;
TSMatrix a1,a2,b;
count = 0;
while(1)
{
prepare();
ch = getchar();
printf("%c\n",ch);
switch(ch)
{
case '-': //进行减法运算的模块选择
{
printf("请输入第一个矩阵\n");
Read_data(&a1);
printf("请输入第二个矩阵\n");
Read_data(&a2);
ch = getchar();
MinusSMatrix(a1, a2, &b);
printf("两个矩阵相减的结果为:\n");
print(b);
break;
}
case '+'://进行加法运算的模块选择
{
}
printf("请输入第一个矩阵\n");
Read_data(&a1);
printf("请输入第二个矩阵\n");
Read_data(&a2);
ch = getchar();
PlusSMatrix(a1, a2, &b);
printf("两个矩阵相加的结果为:\n");
print(b);
break;
case '*'://进行乘法运算的模块选择
{
}
printf("请输入第一个矩阵\n");
Read_data(&a1);
printf("请输入第二个矩阵\n");
Read_data(&a2);
ch = getchar();
MultSMatrix(a1, a2, &b);
printf("两个矩阵相乘的结果为:\n");
print(b);
break;
case 't'://进行转置运算的模块选择
{
}
printf("请输入您要转置的矩阵\n");
Read_data(&a1);
ch = getchar();
TransposeSMatrix(a1, &b);
printf("转置后的结果为:\n");
print(b);
break;
default :printf("输入错误,请重新输入:\n");break;//选择错误
}
count++;
}
return 0;
}
int Read_data(TSMatrix *M)//读取矩阵并转换为三元组的函数
{
int k1,k2,k;
int l,is;
l = 0;
M->num = 0;
printf("请输入矩阵的行数和列数 : ");
scanf("%d%d",&M->rows,&M->cols);
for(k1=1;k1<=M->rows;k1++)
{
is = 0;
for(k2=1; k2<=M->cols; k2++)
{
scanf("%d", &k);
if(k != 0)
{
l++;
M->data[l].r = k1;
M->data[l].c = k2;
M->data[l].e = k;
if(is == 0 )
{
M->rpos[k1] = l;
is++;
}
}
}
}
M->num = l;
return 0;
}
int TransposeSMatrix(TSMatrix M, TSMatrix *T)//矩阵的转置
{
int t,col,p,q;
int a[MAXRC];
int cpot[10000];
T->rows = M.cols; T->cols = M.rows; T->num = M.num;
if(T->num)
{
for(col = 1; col<=M.cols; ++col) a[col] = 0;
for(t=1; t<=M.num; t++) a[M.data[t].c]++;
cpot[1] = 1;
//求第 col 列中的第一个非零元素在 b.data 中的序号
for(col=2; col<=M.cols; ++col) {cpot[col] = cpot[col-1] + a[col-1];}
for(p=1; p<=M.num;++p)
{
col = M.data[p].c; q= cpot[col];
T->data[q].r = M.data[p].c;
T->data[q].c = M.data[p].r;
T->data[q].e = M.data[p].e; ++cpot[col];
}
}
return 0;
}
int PlusSMatrix(TSMatrix M, TSMatrix N, TSMatrix *H)//矩阵的相加
{
int k1, k2,is;
if(M.rows != N.rows || M.cols != N.cols)
{
printf("对不起,这两个矩阵不能进行相加\n");
return 0;
}
H->rows = M.rows; H->cols = M.cols; H->num = 0;
k1 = k2 = 1;
while( k1 <= M.num && k2 <= N.num)
{
= compare(M.data[k1].r, M.data[k1].c, N.data[k2].r, N.data[k2].c);
is
if(is == -1)
{
H->num++;
H->data[H->num].r = M.data[k1].r;
H->data[H->num].c = M.data[k1].c;
H->data[H->num].e = M.data[k1].e;
k1++;
}
else if(is == 1)
{
H->num++;
H->data[H->num].r = N.data[k2].r;
H->data[H->num].c = N.data[k2].c;
H->data[H->num].e = N.data[k2].e;
k2++;
}
else
{
if( M.data[k1].e + N.data[k2].e)
{
H->num++;
H->data[H->num].r = M.data[k1].r;
H->data[H->num].c = M.data[k1].c;
H->data[H->num].e = M.data[k1].e + N.data[k2].e;
}
k1++;
k2++;
}
}
if(k1 <= M.num)
{
}
else
{
H->num++;
H->data[H->num].r = M.data[k1].r;
H->data[H->num].c = M.data[k1].c;
H->data[H->num].e = M.data[k1].e;
k1++;
H->num++;
H->data[H->num].r = N.data[k2].r;
H->data[H->num].c = N.data[k2].c;
H->data[H->num].e = N.data[k2].e;
k2++;
}
return 1;
}
int MinusSMatrix(TSMatrix M, TSMatrix N, TSMatrix *H)//矩阵的相减
{
int k1, k2,is;
if(M.rows != N.rows || M.cols != N.cols)
{
printf("对不起,这两个矩阵不能进行相减\n");
return 0;
}
H->rows = M.rows; H->cols = M.cols; H->num = 0;
k1 = k2 = 1;
while( k1 <= M.num && k2 <= N.num)
{
= compare(M.data[k1].r, M.data[k1].c, N.data[k2].r, N.data[k2].c);
is
if(is == -1)
{
H->num++;
H->data[H->num].r = M.data[k1].r;
H->data[H->num].c = M.data[k1].c;
H->data[H->num].e = M.data[k1].e;
k1++;
}
else if(is == 1)
{
H->num++;
H->data[H->num].r = N.data[k2].r;
H->data[H->num].c = N.data[k2].c;
H->data[H->num].e = -N.data[k2].e;
k2++;
}
else
{
if( M.data[k1].e - N.data[k2].e)
{
H->num++;
H->data[H->num].r = M.data[k1].r;
H->data[H->num].c = M.data[k1].c;
H->data[H->num].e = M.data[k1].e - N.data[k2].e;
}
k1++;
k2++;
}
}
if(k1 <= M.num)
{
H->num++;
H->data[H->num].r = M.data[k1].r;
H->data[H->num].c = M.data[k1].c;
H->data[H->num].e = M.data[k1].e;
k1++;
H->num++;
H->data[H->num].r = N.data[k2].r;
}
else
{
H->data[H->num].c = N.data[k2].c;
H->data[H->num].e = -N.data[k2].e;
k2++;
}
return 1;
}
int MultSMatrix(TSMatrix M, TSMatrix N, TSMatrix *Q)//矩阵的相乘
{
int arow, tp,p,brow,t,q,ccol,k;
int ctemp[1000];
if(M.cols != N.rows)
{
printf("对不起,这两个矩阵不能相乘\n");
return 0;
}
Q->rows = M.rows; Q->cols = N.cols; Q->num = 0;
if( M.num * N.num != 0)
{
for( arow=1; arow<=M.rows; ++arow)
{
for(k=0; k<1000; k++)
{
ctemp[k] = 0;
}
Q->rpos[arow] = Q->num + 1;
if( arow < M.rows )
{
tp = M.rpos[arow+1] ;
}
else
{
tp = M.num + 1;
}
for(p=M.rpos[arow]; p
}
for(ccol = 1; ccol<=Q->cols; ++ccol)
{
if( ctemp[ccol])
{
++Q->num;
Q->data[Q->num].r = arow;
Q->data[Q->num].c = ccol;
Q->data[Q->num].e = ctemp[ccol];
}
}
}
}
return 1;
}
int compare(int x1, int x2, int y1, int y2)//判断矩阵能否相加、相减、相乘的函数
{
if(x1==y1)
{
if(x2==y2)
{
return 0;
}
else if( x2 < y2)
{
return -1;
}
else return 1;
}
else if( x1 < y1)
{
return -1;
}
else return 1;
}
int print(TSMatrix M)//打印矩阵函数
{
int k1, k2,k;
k1 = k2 = k = 1;
for(; k1<=M.rows; k1++)
{
printf("
");