#include <stdio.h>
#include <stdlib.h>
#define MAX 100
#define TRUE 1
#define FAULT 0
struct Triple
{
int i,j;
int e;
};
struct TSMatrix
{
struct Triple data[MAX+1];
int rpos[MAX+1];
int mv,nv,tv;
};
int CreateSMatrix(struct TSMatrix *M)
{
int i,m,n;
int e;
int k;
printf(" 请输入矩阵的行数:");
scanf("%d",&M->mv);
printf(" 请输入矩阵的列数:");
scanf("%d",&M->nv);
printf(" 请输入矩阵的非零元素个数:");
scanf("%d",&M->tv);
M->data[0].i=0;
for(i=1;i<=M->tv;i++)
{
do
{
printf(" 请按行序顺序输入第%d个非零元素所在的行(1~%d):",i,M->mv);
scanf("%d",&m);
printf(" 请按行序顺序输入第%d个非零元素所在的列(1~%d):",i,M->nv);
scanf("%d",&n);
printf(" 请按行序顺序输入第%d个非零元素的值:",i,M->tv);
scanf("%d",&e);
printf("\n");
k=0;
if(m<1||m>M->mv||n<1||n>M->nv)
k=1;
if(m<M->data[i-1].i||m==M->data[i-1].i&&n<=M->data[i-1].j)
k=1;
}while(k);
M->data[i].i=m;
M->data[i].j=n;
M->data[i].e=e;
}
return TRUE;
}
void DestroySMatrix(struct TSMatrix *M)
{
M->mv=0;
M->nv=0;
M->tv=0;
}
void PrintSMatrix(struct TSMatrix M)
{
int i;
printf(" %d行%d列%d个非零元素。\n",M.mv,M.nv,M.tv);
printf(" 行 列 元素值\n");
for(i=1;i<=M.tv;i++)
printf(" %2d%4d%8d\n",M.data[i].i,M.data[i].j,M.data[i].e);
}
int comp(int c1,int c2)
{
int i;
if(c1<c2)
i=1;
else if(c1==c2)
i=0;
else
i=-1;
return i;
}
int AddSMatrix(struct TSMatrix M,struct TSMatrix N,struct TSMatrix *Q)
{
struct Triple *MX,*MY,*NX,*NY,*QX,*QY;
if(M.mv!=N.mv)
return 0;
if(M.nv!=N.nv)
return 0;
Q->mv=M.mv;
Q->nv=M.nv;
MX=&M.data[1];
NX=&N.data[1];
MY=&M.data[M.tv];
NY=&N.data[N.tv];
QX=QY=Q->data;
while(MX<=MY&&NX<=NY)
{
QY++;
switch(comp(MX->i,NX->i))
{
case 1: *QY=*MX;
MX++;
break;
case 0: switch(comp(MX->j,NX->j))
{
case 1: *QY=*MX;
MX++;
break;
case 0: *QY=*MX;
QY->e+=NX->e;
if(!QY->e)
QY--;
MX++;
NX++;
break;
case -1: *QY=*NX;
NX++;
}
break;
case -1: *QY=*NX;
NX++;
}
}
if(MX>MY)
while(NX<=NY)
{
QY++;
*QY=*NX;
NX++;
}
if(NX>NY)
while(MX<=MY)
{
QY++;
*QY=*MX;
MX++;
}
Q->tv=QY-QX;
return TRUE;
}
int SubMatrix(struct TSMatrix M,struct TSMatrix N,struct TSMatrix *Q)
{
int i;
for(i=1;i<=N.tv;i++)
N.data[i].e*=-1;
return AddSMatrix(M,N,Q);
}
void MultSMatrix(struct TSMatrix M,struct TSMatrix N,struct TSMatrix *Q) {
int arow,brow,p,q,ccol,ctemp[MAX+1],t,tp,k=1;
if(M.tv==0||N.tv==0){printf("-----Cannot find matrix!!\n" );return ;}
if(M.nv!=N.mv) {printf("-----Cannot mvltiplication!!\n" );return ;}
for(p=1;p<=M.tv;p++)
{if(M.data[p].i==k)
{M.rpos[k]=p;
k++;}
else if(M.data[p].i>k)
{M.rpos[k]=p--;
k++;}
}
for(;k<=M.mv;k++)M.rpos[k]=M.tv;
k=1;
for(q=1;q<=N.tv;q++)
{if(N.data[q].i==k)
{N.rpos[k]=q;k++;}
else if(N.data[q].i>k)
{N.rpos[k]=q--;k++;}
}
for(;k<=N.mv;k++)N.rpos[k]=N.tv;
Q->mv=M.mv;
Q->nv=N.nv;
Q->tv=0;
for(arow=1;arow<=M.mv;++arow)
{ for(ccol=1;ccol<=N.nv;ccol++)
ctemp[ccol]=0;
if(arow<M.mv)
tp=M.rpos[arow+1];
else tp=M.tv+1;
for(p=M.rpos[arow];p<tp;++p)
{ brow=M.data[p].j;
if(brow<N.mv)
t=N.rpos[brow+1];
else t=N.tv+1;
for(q=N.rpos[brow];q<t;++q)
{ccol=N.data[q].j;
ctemp[ccol]+=M.data[p].e*N.data[q].e;
}
}
for(ccol=1;ccol<=N.nv;ccol++)
if(ctemp[ccol]!=0)
{Q->tv++;
Q->data[Q->tv].i=arow;
Q->data[Q->tv].j=ccol;
Q->data[Q->tv].e=ctemp[ccol];
}
}
}
void main(){
struct TSMatrix M,N,Q;
int m=0;
printf(" *****************************************\n");
printf(" | 相加请输入'1',相减请输入'2',相乘请输入'3' |\n");
printf(" *****************************************\n");
printf(" ");
scanf("%d",&m);
do{ if(m==0) break;
else{
printf("\n 请输入第一个三元矩阵:\n");
CreateSMatrix (&M);
printf("\n 请输入第二个三元矩阵:\n");
CreateSMatrix (&N);
printf("\n 第一个矩阵是:\n");
PrintSMatrix(M);
printf("\n 第二个矩阵是:\n");
PrintSMatrix(N);
switch(m){
case 1: printf("\n\n 两个矩阵相加结果是:\n");
AddSMatrix(M,N,&Q);
PrintSMatrix(Q);
DestroySMatrix(&Q);
break;
case 2 :
printf("\n\n 两个矩阵相减结果是:\n");
SubMatrix(M,N,&Q);
PrintSMatrix(Q);
DestroySMatrix(&Q); break;
case 3 :
printf("\n\n 两个矩阵相乘结果是:\n");
MultSMatrix(M,N,&Q);
PrintSMatrix(Q);
DestroySMatrix(&Q); break;
default :break;
}
}
printf("\n\n\n\n ********************************************************\n");
printf(" | 相加请输入'1',相减请输入'2',相乘请输入'3',退出请输入'0' |\n");
printf(" ********************************************************\n");
printf(" ");
scanf("%d",&m);
continue;
}while(m);
}
#include <stdio.h>
#include <stdlib.h>
#define MAX 100
#define TRUE 1
#define FAULT 0
struct Triple
{
int i,j;
int e;
};
struct TSMatrix
{
struct Triple data[MAX+1];
int rpos[MAX+1];
int mv,nv,tv;
};
int CreateSMatrix(struct TSMatrix *M)
{
int i,m,n;
int e;
int k;
printf(" 请输入矩阵的行数:");
scanf("%d",&M->mv);
printf(" 请输入矩阵的列数:");
scanf("%d",&M->nv);
printf(" 请输入矩阵的非零元素个数:");
scanf("%d",&M->tv);
M->data[0].i=0;
for(i=1;i<=M->tv;i++)
{
do
{
printf(" 请按行序顺序输入第%d个非零元素所在的行(1~%d):",i,M->mv);
scanf("%d",&m);
printf(" 请按行序顺序输入第%d个非零元素所在的列(1~%d):",i,M->nv);
scanf("%d",&n);
printf(" 请按行序顺序输入第%d个非零元素的值:",i,M->tv);
scanf("%d",&e);
printf("\n");
k=0;
if(m<1||m>M->mv||n<1||n>M->nv)
k=1;
if(m<M->data[i-1].i||m==M->data[i-1].i&&n<=M->data[i-1].j)
k=1;
}while(k);
M->data[i].i=m;
M->data[i].j=n;
M->data[i].e=e;
}
return TRUE;
}
void DestroySMatrix(struct TSMatrix *M)
{
M->mv=0;
M->nv=0;
M->tv=0;
}
void PrintSMatrix(struct TSMatrix M)
{
int i;
printf(" %d行%d列%d个非零元素。\n",M.mv,M.nv,M.tv);
printf(" 行 列 元素值\n");
for(i=1;i<=M.tv;i++)
printf(" %2d%4d%8d\n",M.data[i].i,M.data[i].j,M.data[i].e);
}
int comp(int c1,int c2)
{
int i;
if(c1<c2)
i=1;
else if(c1==c2)
i=0;
else
i=-1;
评论1