稀疏矩阵的压缩存储

#include <iostream>
#include<stdlib.h>
using namespace std;
struct cun     //存放行、列、值
{
    int hang,lie,value;
    cun&operator = (cun&x)
    {
        hang = x.hang;
        lie=x.lie;
        value=x.value;
    }
};

class juzhen      //矩阵类
{
    friend ostream& operator <<(ostream& output,juzhen& M);//运算符<<重载
    friend istream& operator >>(istream& input,juzhen& M);//运算符>>重载
public:
    juzhen(juzhen &x);//gouzao
    juzhen(int maxSz=100);  //定义大小
    juzhen zhuanzhi();        //稀疏矩阵转置
    juzhen Add(juzhen &b);    //当前稀疏矩阵与b相加
private:
    int rows,cols,terms;
    cun *smArray;
    int maxTerms;
};

ostream& operator << (ostream& output, juzhen& M)//运算符<<重载
{
    for(int i=0; i<M.terms; i++)
        if(M.smArray[i].value!=0)
            output<<M.smArray[i].hang<<" "<<M.smArray[i].lie<<" "<<M.smArray[i].value<<endl;
    return output;
};
istream& operator >>(istream& input,juzhen& M)//运算符>>重载
{
    input>>M.rows>>M.cols>>M.terms;
    for(int i=0; i<M.terms; i++)
    {
        input>>M.smArray[i].hang>>M.smArray[i].lie>>M.smArray[i].value;
    }
    return input;
}
juzhen::juzhen(juzhen &x)//构造函数1
{
    rows=x.rows;
    cols=x.cols;
    terms=x.terms;
    maxTerms=x.maxTerms;
    smArray=new cun[maxTerms];
    for(int i=0; i<terms; i++)
    {
        smArray[i]=x.smArray[i];
    }
};
juzhen::juzhen(int maxSz):maxTerms(maxSz)//构造函数2
{
    smArray=new cun[maxSz];
    rows=cols=terms=0;
};
juzhen juzhen::zhuanzhi()
{
    juzhen b(maxTerms);
    b.rows=cols;
    b.cols=rows;
    b.terms=terms;
    if(terms>0)
    {
        int j,i,currentB=0;
        for(j=0; j<cols; ++j)
            for(i=0; i<terms; ++i)
                if(smArray[i].lie==j)
                {
                    b.smArray[currentB].hang=j;
                    b.smArray[currentB].lie=smArray[i].hang;
                    b.smArray[currentB].value=smArray[i].value;
                    currentB++;
                }
    }
    return b;
}
juzhen juzhen:: Add(juzhen &b)
{
    juzhen result;//结果矩阵
    int i=0,j=0,c,d;
    result.terms=0;
    while(i<terms&&j<b.terms)
    {
        c=cols*smArray[i].hang+smArray[i].lie;
        d=cols*b.smArray[j].hang+b.smArray[j].lie;
        if(c<d)
        {
            result.smArray[result.terms]=smArray[i];
            i++;
        }
        else if(c>d)
        {
            result.smArray[result.terms]=b.smArray[j];
            j++;
        }
        else
        {
            result.smArray[result.terms]=smArray[i];
            result.smArray[result.terms].value=smArray[i].value+b.smArray[j].value;
            i++;
            j++;
        }
        result.terms++;
    }
    for(; i<terms; i++)
    {
        result.smArray[result.terms]=smArray[i];
        result.terms++;
    }
    for(; j<b.terms; j++)
    {
        result.smArray[result.terms]= b.smArray[i];
        result.terms++;
    }
    return result;
}


int main()
{
    juzhen x,y,z,w;
    cin>>x>>y;
    z=x.zhuanzhi();
    w=x.Add(y);
    cout<<"The transformed matrix  is:"<<endl;
    cout<<z;
    cout<<"The added matrix is:"<<endl ;
    cout<<w;
    return 0;
}

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值