📄 稀疏距阵的数组实现.cpp
字号:
#include<iostream.h>
const int maxsize=10;
struct syz
{
int i,j;
float a;
};
class jz
{
private:
syz L[maxsize];
int mu,nu,tu;
public:
jz()
{
for(int m=0;m<maxsize;m++)
{L[m].a=0.0;}
mu=nu=tu=0;
};
void creat(int a,int b)
{
mu=a;nu=b;tu=0;
cout<<"请按行依次输入非零元素!!!!!!否则可能出错!!!!!"<<endl;
cout<<"输入(0,0,0)结束!"<<endl;
for(tu;;tu++)
{
cout<<"它的行标为:";
cin>>L[tu].i;
/*for(k=0;k<tu;k++)
{
if(L[k].i>L[tu].i && L[tu].i!=0)
{
cout<<endl;cout<<"您输入的数据有误,请重新输入:)"<<endl;
cout<<"它的行标为:";
cin>>L[tu].i;
k=0;
}
}//纠错未实现
*/
cout<<"它的列标为:";
cin>>L[tu].j;
cout<<"它的数值为:";
cin>>L[tu].a;
cout<<endl;
if(!L[tu].i&&!L[tu].j&&!L[tu].a)break;
if(tu>=maxsize)cout<<"请申请更大空间存储!"<<endl;
}
};//建立矩阵
void Trans(jz &y)
{
y.mu=nu; y.nu=mu; y.tu=tu;
if(y.tu)
{
int q=0;
for(int col=0;col<nu;++col)
for(int p=0;p<tu;++p)
if(L[p].j==col)
{
y.L[q].i=L[p].j;
y.L[q].j=L[p].i;
y.L[q].a=L[p].a;
++q;
}//要进行三远组的按行排序
}
//****************************************************************************
/*
for(int col=1;col<=nu;col++)
num[col]=0;
for(int t=1;t<=tu;t++)num[L[t].j]++;
cpot[1]=1;
for(col=2;col<=nu;col++)cpot[col]=cpot[col-1]+num[col-1];
for(int p=1;p<=tu;p++)
{
col=L[p].j;
q=cpot[col];
y.L[q].i=L[p].j;
y.L[q].j=L[p].i;
y.L[q].a=L[p].a;
cpot[col]++;
}
};
*/
//***************************上述代码是快速转置一样调试成功!********************
};//转置
//**************************加法注释:***********************************
/*
1两矩阵相加的前提:两矩阵的行数和列数分别对应相等;
2两矩阵相加的结果:行、列数不变;
3具有相同行号和列号的元素相加,如果相加结果为0,则不在结果矩阵中建立结点;
4三元组都是按行排列的!
*/
//***********************************************************************
void Add(jz b,jz &c)
{
if(mu!=b.mu&&nu!=b.nu)
cout<<"抱歉不能实现加法,原因可能是两个矩阵不是相同行数和列数"<<endl;
c.tu=tu+b.tu;
c.mu=mu;
c.nu=nu;
syz *p,*p1,*p2;
p=c.L;
p1=L;
p2=b.L;
while(p1<L+tu && p2<b.L+b.tu)
{
if(p1->i<p2->i || (p1->i==p2->i && p1->j<p2->j) )*p++=*p1++;
else if(p1->i>p2->i ||(p1->i==p2->i && p1->j>p2->j))*p++=*p2++;
else if(p1->i==p2->i && p1->j==p2->j)
{p->i=p1->i;p->j=p1->j;p->a=p1->a+p2->a;p++;p1++;p2++;c.tu--;}
}
while(p1<L+tu)*p++=*p1++;
while(p2<b.L+b.tu)*p++=*p2++;
};//加法
void print()
{
/*
int p=0;
if(tu==0)cout<<"此矩阵为空矩阵!!"<<endl;
else
for(int x=1;x<=mu;x++)
{
int y=1;
//for(int p=0;p<tu;p++)
if(L[p].i-x>=1&&!p)
{
for(y=1;y<=nu;y++)
{
cout<<"0"<<",";
}
cout<<endl;
continue;
}//处理前面为0的矩阵
y=1;
while(x==L[p].i)
{
if(y<L[p].j)
{cout<<"0"<<",";y++;}
if(y==L[p].j)
{cout<<L[p].a<<",";y++;p++;}
if(L[p].i!=x)
{
for(y;y<=nu;y++)
cout<<"0"<<",";
cout<<endl;
}
}
if(L[p].i-x>1)
{
for(y=1;y<=nu;y++)
{
cout<<"0"<<",";
}
cout<<endl;
}
if(p==tu){p++;continue;}
while(p>tu)
{
for(int i=0;i<nu;i++)
cout<<"0"<<",";
cout<<endl;
break;
}//处理结尾都为0的矩阵
}
*/
//经验!!!!!如果问题有很多方面,先不要把问题分细,先试试能不能有循环!!!!
//如果不是那样太麻烦了!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
for(int x=1;x<=mu;x++)//行先循环
{
for(int y=1;y<=nu;y++)
{
for(int p=0;p<tu;)
{if(L[p].i==x && L[p].j==y){cout<<L[p].a<<",";break;}
else p++;}
if(p==tu)cout<<"0"<<",";
}
cout<<endl;
}
};//输出
};
void main()
{
jz a,b,c,d;
int mu,nu;
cout<<"请输入a矩阵的行数:";
cin>>mu;
cout<<"请输入a矩阵的列数:";
cin>>nu;
a.creat(mu,nu);
a.print();
a.Trans(d);
cout<<"............................"<<endl;
d.print();
cout<<":)转置成功!"<<endl;
cout<<"请输入b矩阵的行数:";
cin>>mu;
cout<<"请输入b矩阵的列数:";
cin>>nu;
b.creat(mu,nu);
b.print();
cout<<"............................"<<endl;
a.Add(b,c);//加法
c.print();
cout<<"加法成功!!"<<endl;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -