特殊矩阵的压缩矩阵及其转置

//已有数据稀疏矩阵的压缩存储及转置
/*#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;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值