开始恢复写程序了,快正常了~这次的程序很难的,而且系列性啊……最让我惊诧的是看到了别人的减法算法,太牛了……
Matrix.h:定义了基本操作
#include <iostream>
using namespace std;
enum {OK=-1,WRONG=0,MAX=100};
typedef int Status;
typedef int Elem;
struct Triple
{
int i,j;
Elem e;
};
struct TMatrix
{
Triple *data;
int mu,nu,tu;
};
Status CreateMatrix(TMatrix &M)
{
int i,k;
cout<<"请输入矩阵的行数、列数、非零元素的个数:";
cin>>M.mu>>M.nu>>M.tu;
M.data=new Triple[M.tu+1];
if(M.data==NULL)
return WRONG;
M.data[0].i=0;
for(i=1;i<=M.tu;i++)
{
do
{
cout<<"请按顺序输入第"<<i<<"个元素的行、列、值:";
cin>>M.data[i].i>>M.data[i].j>>M.data[i].e;
if(M.data[i].i>M.mu||M.data[i].j>M.nu||M.data[i].j<1||M.data[i].i<1||M.data[i].e==0)
k=-1;
if(M.data[i].i<M.data[i-1].i||M.data[i].i==M.data[i-1].i&&M.data[i].j<=M.data[i].j)
k=-1;
}while(!k);
}
return OK;
}
void Print(TMatrix M)
{
int i;
cout<<M.mu<<"行"<<M.nu<<"列"<<M.tu<<"个非零元素"<<endl;
cout<<"行 "<<"列 "<<"元素值 "<<endl;
for(i=1;i<=M.tu;i++)
{
cout<<" "<<M.data[i].i<<" "<<M.data[i].j<<" "<<M.data[i].e<<endl;
}
}
void PrintMatrix(TMatrix M)
{
int i,j,k=1;
Triple *p;
p=&M.data[1];
if(M.tu)
{
for(i=1;i<=M.mu;i++)
{
for(j=1;j<=M.nu;j++)
if(k<=M.tu&&p->i==i&&p->j==j)
{
cout.width(3);
cout<<p->e;
p++;
k++;
}
else
{
cout.width(3);
cout<<0;
}
cout<<endl;
}
}
}
void DestroyMatrix(TMatrix &M)
{
delete M.data;
M.mu=M.nu=M.tu=0;
}
Status CopyMatrix(TMatrix M,TMatrix &T)
{
T=M;
return OK;
}
int comp(int c1,int c2)
{
if(c1<c2)
return -1;
if(c1==c2)
return 0;
return 1;
}
Status AddMatrix(TMatrix M,TMatrix N,TMatrix &Q)
{
int m=1,n=1,q=1;
if(M.mu!=N.mu||M.nu!=N.nu)
return WRONG;
Q.mu=M.mu;
Q.nu=M.nu;
Q.data=new Triple[M.tu+N.tu+1];
if(Q.data==NULL)
return WRONG;
while(m<=M.tu&&n<=N.tu)
{
switch(comp(M.data[m].i,N.data[n].i))
{
case -1:
Q.data[q++]=M.data[m++];
break;
case 1:
Q.data[q++]=N.data[n++];
break;
case 0:
switch(comp(M.data[m].j,N.data[n].j))
{
case -1:
Q.data[q++]=M.data[m++];
break;
case 1:
Q.data[q++]=N.data[n++];
break;
case 0:
Q.data[q].i=N.data[n].i;
Q.data[q].j=N.data[n].j;
Q.data[q].e=M.data[m++].e+N.data[n++].e;
q++;
break;
}
}
}
while(m<=M.tu)
{
Q.data[q++]=M.data[m++];
}
while(n<=N.tu)
{
Q.data[q++]=N.data[n++];
}
Q.tu=q-1;
return OK;
}
Status SubtMatrix(TMatrix M,TMatrix N,TMatrix &Q)
{
int i;
Q.mu=M.mu;
N.nu=N.nu;
Q.data=new Triple[M.tu+N.tu+1];
for(i=1;i<=M.tu;i++)
M.data[i].e*=-1;
AddMatrix(M,N,Q);
return OK;
}
main.cpp:主程序
#include "Matrix.h"
int main()
{
TMatrix T,T1,T2;
cout<<"创建T1"<<endl;
CreateMatrix(T1);
cout<<"输出T1"<<endl;
PrintMatrix(T1);
cout<<"创建T2"<<endl;
CreateMatrix(T2);
cout<<"输出T2"<<endl;
PrintMatrix(T2);
AddMatrix(T1,T2,T);
cout<<"输出T1+T2:"<<endl;
PrintMatrix(T);
cout<<"输出T1-T2:"<<endl;
SubtMatrix(T1,T2,T);
PrintMatrix(T);
Print(T);
return 0;
}