以三元组形式键盘输入稀疏矩阵非零元素.docx
《以三元组形式键盘输入稀疏矩阵非零元素.docx》由会员分享,可在线阅读,更多相关《以三元组形式键盘输入稀疏矩阵非零元素.docx(9页珍藏版)》请在冰豆网上搜索。
以三元组形式键盘输入稀疏矩阵非零元素
以三元组形式键盘输入稀疏矩阵非零元素
#include
#include
//usingnamespacestd;
template
structB
{inti;
intj;
Tv;
};
template
classX_Array
{
private:
intmm;
intnn;
inttt;
B*bb;
int*pos;
int*num;
public:
voidin_X_Array();
voidcp_X_Array(int,int,int,B[]);
voidth_X_Array(int,int,T[]);
voidprt_X_Array();
X_Arraytran_X_Array();
X_Arrayoperator+(X_Array&);
X_Arrayoperator*(X_Array&);
};
//以三元组形式键盘输入稀疏矩阵非零元素template
voidX_Array:
:
in_X_Array(){intk,m,n;
cout<<"输入行数列数非零元素个数:
";
cin>>mm>>nn>>tt;
bb=newB[tt];
cout<<"输入行数列数非零元素值:
"<{cin>>m>>n>>bb[k].v;
bb[k].i=m-1;bb[k].j=n-1;
}
pos=newint[mm];
num=newint[mm];
for(k=0;kfor(k=0;k
num[bb[k].i]=num[bb[k].i]+1;pos[0]=0;
for(k=1;kpos[k]=pos[k-1]+num[k-1];return;
}
//复制三元组数组
template
voidX_Array:
:
cp_X_Array(intm,intn,intt,Bb[])
{intk;
mm=m;nn=n;tt=t;
bb=newB[tt];
for(k=0;k{bb[k].i=b[k].i-1;bb[k].j=b[k].j-1;bb[k].v=b[k].v;}
pos=newint[mm];num=newint[mm];for(k=0;knum[bb[k].i]=num[bb[k].i]+1;pos[0]=0;
for(k=1;kpos[k]=pos[k-1]+num[k-1];return;
}
//有一般稀疏矩阵转换templatevoidX_Array:
:
th_X_Array(intm,intn,Ta[])
{intk,t=0,p,q;
Td;
for(k=0;kif(a[k]!
=0)t=t+1;
mm=n;nn=n;tt=t;
bb=newB[tt];
k=0;
for(p=0;pfor(q=0;q{d=a[p*n+q];
if(d!
=0)
{bb[k].i=p;bb[k].j=q;bb[k].v=d;
k=k+1;
}
}
pos=newint[mm];
num=newint[mm];
for(k=0;knum[bb[k].i]=num[bb[k].i]+1;pos[0]=0;
for(k=1;kpos[k]=pos[k-1]+num[k-1];
return;
}
//按行输出稀疏矩阵
template
voidX_Array:
:
prt_X_Array(){intk,kk,p;
for(k=0;k{
p=pos[k];
for(kk=0;kkif((bb[p].i==k)&&(bb[p].j==kk))
{
cout<elsecout<cout<return;
}
//稀疏矩阵转置template
X_ArrayX_Array:
:
tran_X_Array()
{X_Arrayat;
intk,p,q;
at.mm=nn;at.nn=mm;at.tt=tt;at.bb=newB[tt];k=0;
for(p=0;pfor(q=0;q
{
if(bb[q].j==p)
{at.bb[k].i=bb[q].j;
at.bb[k].j=bb[q].i;
at.bb[k].v=bb[q].v;
k=k+1;
}
}
at.pos=newint[at.mm];
at.num=newint[at.nn];
for(k=0;kat.num[at.bb[k].i]=at.num[at.bb[k].i]+1;at.pos[0]=0;
for(k=1;kat.pos[k]=at.pos[k-1]+at.num[k-1];return(at);
}
//稀疏矩阵相加
template
X_ArrayX_Array:
:
operator+(X_Array&b)
{
X_Arrayc;
B*a;
Td;
intm,n,k,p;
if((nn!
=b.nn)||(nn!
=b.nn))cout<<"不能相加~"<else
{a=newB[tt+b.tt];
p=0;
for(k=0;k{
m=pos[k];n=b.pos[k];
while((bb[m].i==k)&&(b.bb[n].i==k))
{
if(bb[m].j==b.bb[n].j)
{d=bb[m].v+b.bb[n].v;
if(d!
=0)
{
a[p].i=k;a[p].j=bb[m].j;
a[p].v=d;p=p+1;
}
m=m+1;n=n+1;
}
elseif(bb[m].j{a[p].i=k;a[p].j=bb[m].j;
a[p].v=bb[m].v;p=p+1;
m=m+1;
}
else
{a[p].i=k;a[p].j=b.bb[n].j;
a[p].v=b.bb[n].v;p=p+1;
n=n+1;
}
}
while(bb[m].i==k)
{a[p].i=k;a[p].j=bb[m].j;
a[p].v=bb[m].v;p=p+1;
m=m+1;
}
while(bb[n].i==k)
{a[p].i=k;a[p].j=b.bb[n].j;
a[p].v=b.bb[n].v;p=p+1;
n=n+1;
}
}
c.mm=mm;c.nn=nn;c.tt=p;
c.bb=newB[p];
for(k=0;k
{
c.bb[k].i=a[k].i;
c.bb[k].j=a[k].j;
c.bb[k].v=a[k].v;
}
deletea;
c.pos=newint[c.mm];
c.num=newint[c.mm];
for(k=0;kc.num[k]=0;
for(k=0;kc.num[c.bb[k].i]=c.num[c.bb[k].i]+1;
c.pos[0]=0;
for(k=1;kc.pos[k]=c.pos[k-1]+c.num[k-1];
}
return(c);
}
//稀疏矩阵相乘
template
X_ArrayX_Array:
:
operator*(X_Array&b)
{
X_Arraycc;
intk,m,n,p,t;
T*c;
if(nn!
=b.mm)
cout<<"两矩阵无法相乘~"<else
{
c=newT[mm*b.nn];
k=0;
for(m=0;mfor(n=0;n{
c[k]=0;k=k=1;
}
for(m=0;m
{
k=bb[m].j;
n=b.pos[k];
t=b.pos[k]+b.num[k];
while(n!
=t)
{
p=bb[m].i*b.nn+b.bb[n].j;
c[p]=c[p]+bb[m].v*b.bb[n].v;
n=n=1;
}
}
cc.th_X_Array(mm,b.nn,c);
deletec;
}
return(cc);
}
voidmain()//系统主模块{
charchoice;
intj=1;
X_Arraya,b,c,d;
//charsearch[10];
while(j)
{cout<<"\n\n\n\n";
cout<<"\t\t\t-----------------稀疏矩阵运算器--------------\n";
cout<<"\n\t\t\t*********************************************";
cout<<"\n\t\t\t**1-------输入稀疏矩阵**";
cout<<"\n\t\t\t**2-------输出稀疏矩阵**";
cout<<"\n\t\t\t**3-------系数矩阵的转置**";
cout<<"\n\t\t\t**4-------稀疏矩阵的加法**";
cout<<"\n\t\t\t**5-------稀疏矩阵的乘法**";
cout<<"\n\t\t\t**0-------退出**";
cout<<"\n\t\t\t*********************************************";
cout<<"\t\t\t请选择菜单号(0--7):
"<cin>>&choice;
if(choice=='1')
a.in_X_Array();
elseif(choice=='2')
a.prt_X_Array();
elseif(choice=='3')
b=a.tran_X_Array();
elseif(choice=='4')
c=a+b;
elseif(choice=='5')
d=a*b;
elseif(choice=='0')
{j=0;
cout<<"\t\t\t程序结束!
\n"<elsecout<<"\n输入错误!
请重新输入!
"<}
}