数据结构第五章-数组:稀疏矩阵转置

1.菜鸟版:二维数组存储矩阵 并实现矩阵转置

    int m,n;
    cout<<"请输入行数 列数:"<<endl;
    cin>>m>>n;
    int a[max][max]={0};
    int res[max][max]={0};
    for(int i=0;i<m;i++)
    {
        for(int j=0;j<n;j++)
        {
            cin>>a[i][j];
            res[j][i]=a[i][j];
        }
    }
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<m;j++)
        {
            cout<<res[i][j]<<' ';
        }
        cout<<endl;
    }

结果:
在这里插入图片描述

2.进阶版(稀疏矩阵):用三元组存储矩阵的非零元素

三元组(是个结构体):一个数组+矩阵的行数+列数+非零元素的个数
三元组的元素(也就是存在数组里的元素,也是个结构体):矩阵中非零元素的行下标、列下标以及数值
(mu:矩阵的行数 nu:矩阵的列数)

#define SMAX 1000  
typedef struct
{
     int i,j;          //储存非零元素的行和列信息
     datatype v; //非零元素的值    
}SPNode;        //数组里的元素

typedef struct
{
     int mu,nu,tu; //矩阵的行、列和非零元素的个数  
     SPNode data[SMAX+1]; //三元组数组,第0位不用
}SPMatrix;

在这里插入图片描述
原本的三元组:先存第一行的元素,再存第二行的元素…
那么要如何存储到转置后的三元组数组里呢?
理论上说,只需要将原本元素的行和列交换一下,存储到新的三元组里即可,但是问题是,这样并不方便我们在新的三元组里找到它的位置,比如,【1,2,14】和【1,5,-5】这两个元素,第一个转置之后跑到了第二行去,第二个元素转置后跑到了第五行去,暂时好像没看出什么能在转置后的矩阵中快速找到它们的规律呢!
在这里插入图片描述
①遍历 原三元组的 列,得出每列有几个元素(由下图可知,第一列有1个元素,第二列有2个元素,第三列0个,第四列1个,第五列1个),所以转置后的矩阵,第一行有1个元素,第二行有2个元素,第三行0个,第四行1个,第五行1个
在这里插入图片描述
②在新的数组中,第一行首元素存在数组第一个的位置,第二行首元素存在第一行首元素地址+第一行元素个数的位置…以此类推。也就是说,只要统计好原矩阵中每一列的元素个数(也就是转置后的矩阵中每一行的元素个数),就可以知道转置后矩阵中每一行的起始地址。

在这里插入图片描述cpot数组用于储存 转置后的矩阵 每一行的起始位置(=上一行的起始位置+上一行的元素个数)

代码:
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值