//已有数据稀疏矩阵的压缩存储及转置
/*#include<iostream>
#include<iomanip>
using namespace std;
struct SYZ
{
int i,j,v;
};
struct JZ
{
int hang,lie;
int n;
SYZ *data;
};
void CSH(JZ &a)
{
a.hang=4;
a.lie=5;
a.n=4;
a.data=new SYZ [a.n];
a.data[0].i=a.data[0].j=0;a.data[0].v=1;
a.data[1].i=0;a.data[1].j=3;a.data[1].v=1;
a.data[2].i=1;a.data[2].j=1;a.data[2].v=2;
a.data[3].i=2;a.data[3].j=1;a.data[3].v=7;
}
void output(JZ &a)
{
cout<<"i"<<setw(4)<<"j"<<setw(4)<<"v"<<endl;
int k=0;
for(;k<a.n;k++)
cout<<a.data[k].i+1<<setw(4)<<a.data[k].j+1<<setw(4)<<a.data[k].v<<endl;
}
void change(JZ a,JZ &b)
{
int k1=0,k2;
b.hang=a.lie;
b.lie=a.hang;
b.n=a.n;
b.data=new SYZ [b.n];
int n1=0;
for(;k1<b.lie;k1++)
for(k2=0;k2<a.n;k2++)
{
if(a.data[k2].j==k1)
{
b.data[n1].i=a.data[k2].j;
b.data[n1].j=a.data[k2].i;
b.data[n1].v=a.data[k2].v;
n1++;
}
}
}
int main()
{
JZ a,b;
CSH(a);
cout<<"该矩阵的行数,列数,不为零的元素的个数分别为:"<<a.hang<<","<<a.lie<<","<<a.n<<endl;
cout<<"输出初始矩阵的三元线性表为:"<<endl;
output(a);
change(a,b);
cout<<"输出转置后的矩阵的三元线性表为:"<<endl;
output(b);
return 0;
}*/
//输入数据稀疏矩阵的压缩存储及转置
/*#include<iostream>
#include<iomanip>
using namespace std;
struct SYZ
{
int i,j,v;
};
struct JZ
{
int hang,lie;
int n;
SYZ *data; //一定要定义指针,因为后面要开动态数组
};
void CSH(JZ &a) //初始化矩阵
{
cout<<"输入矩阵的行数,列数及非零数的个数:";
cin>>a.hang>>a.lie>>a.n;
a.data=new SYZ [a.n];
cout<<"输入非零元素所在的行数,列数及该值:"<<endl;
for(int k=0;k<a.n;k++)
{
cin>>a.data[k].i>>a.data[k].j>>a.data[k].v;
a.data[k].i--;
a.data[k].j--;
}
}
void output(JZ &a) //矩阵非零元素的线性表输出
{
cout<<"i"<<setw(4)<<"j"<<setw(4)<<"v"<<endl;
int k=0;
for(;k<a.n;k++)
cout<<a.data[k].i+1<<setw(4)<<a.data[k].j+1<<setw(4)<<a.data[k].v<<endl;
}
void JZ_output(JZ c) //矩阵的输出形式
{
int k1,k2,k3;
for(k1=0;k1<c.hang;k1++)
{
for(k2=0;k2<c.lie;k2++)
{
bool frag(true);
for(k3=0;k3<c.n;k3++)
if((k1==c.data[k3].i)&&(k2==c.data[k3].j))
{
cout<<c.data[k3].v<<" ";
frag=false;
}
if(frag)cout<<0<<" ";
}
cout<<endl;
}
}
void change(JZ a,JZ &b) //矩阵的转置
{
int k1=0,k2;
b.hang=a.lie;
b.lie=a.hang;
b.n=a.n;
b.data=new SYZ [b.n];
int n1=0;
for(;k1<b.lie;k1++)
for(k2=0;k2<a.n;k2++)
{
if(a.data[k2].j==k1)
{
b.data[n1].i=a.data[k2].j;
b.data[n1].j=a.data[k2].i;
b.data[n1].v=a.data[k2].v;
n1++;
}
}
}
int main()
{
JZ a,b;
CSH(a);
cout<<"该矩阵的行数,列数,不为零的元素的个数分别为:"<<a.hang<<","<<a.lie<<","<<a.n<<endl;
cout<<"矩阵为:"<<endl;
JZ_output(a);
cout<<"输出初始矩阵的三元线性表为:"<<endl;
output(a);
change(a,b);
cout<<"转置后的矩阵为:"<<endl;
JZ_output(b);
cout<<"输出转置后的矩阵的三元线性表为:"<<endl;
output(b);
return 0;
}*/
//特殊矩阵的压缩存储---对称矩阵
/*#include<iostream>
using namespace std;
int main()
{
cout<<"请输入方阵的行数,列数为:";
int h,l,n,*data,i,j;
cin>>h>>l;
n=h*(1+l)/2;
data=new int [n];
cout<<"请输入对称方阵的下三角的所有数据:"<<endl;
for(i=0;i<h;i++)
for(j=0;j<l;j++)
{
if(i>=j)cin>>data[i*(i+1)/2+j];
}
for(i=0;i<h;i++)
{
for(j=0;j<l;j++)
{
if(i<j)cout<<data[j*(j+1)/2+i]<<" ";
else
cout<<data[i*(i+1)/2+j]<<" ";
}
cout<<endl;
}
return 0;
}*/
//特殊矩阵的压缩存储---下三角矩阵
#include<iostream>
using namespace std;
int main()
{
cout<<"请输入方阵的行数,列数为:";
int h,l,n,*data,i,j;
cin>>h>>l;
n=h*(1+l)/2;
data=new int [n+1];
cout<<"请输入对角方阵的下三角的所有数据:"<<endl;
for(i=0;i<h;i++)
for(j=0;j<l;j++)
{
if(i>=j)cin>>data[i*(i+1)/2+j];
}
data[n]=0;
for(i=0;i<h;i++)
{
for(j=0;j<l;j++)
{
if(i>=j)cout<<data[j*(j+1)/2+i]<<" ";
else
cout<<data[n]<<" ";
}
cout<<endl;
}
return 0;
}