实验6、压缩矩阵的2种转置运算

具体讲解

#include <iostream>
#include <vector>
using namespace std;

struct Triple {
    Triple() {

    }

    int i = 1;
    int j = 1;
    int e = 1 ;
    Triple(int i, int j, int e) {
        this->i = i;
        this->j = j;
        this->e = e;
    }
};


struct TSMatrix {
    int row;
    int col;
    int count;
    Triple* data;
    TSMatrix(){}
    TSMatrix(int r, int c, int cnt) :row(r), col(c), count(cnt) {
        data = new Triple[cnt];
    }
    TSMatrix(TSMatrix const& m) :row(m.row), col(m.col), count(m.count) {
        data = new Triple[count];
        for (int i = 0; i < count; i++)
            data[i] = m.data[i];
    }
    ~TSMatrix() {
        delete[] data;
    }
    //创建矩阵
    void creatMatrix() {
        for (int i = 0; i < count; ++i) {
            cout << "请输入第 " << i + 1<< " 个元素" << endl;
            cout << "行数:";
            int r;
            cin >> r;
            cout << "列数:";
            int c;
            cin >> c;
            if (i > 0 && (data[i - 1].i > r || (data[i - 1].i == r && data[i - 1].j >= c)))
            {
            //只要进入这个花括号内,就表明输入的下标错误
            //根据要求,先检查是否重复
                bool dup = false;//先假设不重复
                for (int j = 0; j < i; j++)
                {
                    if (data[j].i == r && data[j].j == c)
                    {
                        cout << "输入错误,输入的下标重复,请重新输入!" << endl;
                        dup = true;//表明下标重复了
                        break;
                    }
                }
                if (!dup)//下标重复,就不需要输出这句话了,否则输出
                    cout << "输入错误,下标输入时要递增输入,请重新输入!" << endl;
                i--;
                continue;
            }
            int e;
            cout << "  值:";
            cin >> e;
            Triple tmp(r, c, e);
            data[i] = tmp;
            cout << endl;
        }
    }
    //输出矩阵
    void print() {
        int c = 0;
        for (int i = 0; i < row; i++)
        {
            for (int j = 0; j < col; j++)
            {
                if (data[c].i == i + 1 && data[c].j == j + 1 && c < count)
                    cout <<" "<< data[c++].e<<" ";
                else
                    cout << " 0 ";
            }
            cout << endl;
        }
    }
    //一般转置
    TSMatrix transpose() {
        TSMatrix tMatrix(col, row, count);
        int q = 0;
        //这是竖着遍历的
        for (int i = 1; i <= row; i++)
        {
            for (int j = 0; j < count ; j++)
            {
                if (data[j].j == i)
                {
                    tMatrix.data[q].e = data[j].e;
                    tMatrix.data[q].i = data[j].j;
                    tMatrix.data[q].j = data[j].i;
                    q++;
                }
            }
        }
        return tMatrix;
    }
    //快速转置
    TSMatrix quickTranspose()
    {
        TSMatrix tMatrix(col, row, count);
		//列数是下标加一
        vector<int> num(col, 0);//下标i减一得到第i列非零元的个数
        vector<int> cpot(col,0);//下标i减一得到第i列第一个非零元的存放的位置
		//算出每一列有多少个元素
        for (int i = 0; i < count; i++)
            num[data[i].j - 1]++;
		//算出每一列的开头要存放的位置
        for (int i = 1; i < col; i++)
            cpot[i] = cpot[i - 1] + num[i - 1];
        
        for (int i = 0; i < count; i++)
        {
            int p = cpot[data[i].j - 1];
            tMatrix.data[p].e = data[i].e;
            tMatrix.data[p].i = data[i].j;
            tMatrix.data[p].j = data[i].i;
            cpot[data[i].j - 1]++;
        }
        return tMatrix;
    }
};

void showMain();

int main() {
    bool hasMatrix = false;
    bool flag = true;
    TSMatrix tsMatrix;
    showMain();
    int opt;
    while (flag) {
        cin >> opt;
        if (!hasMatrix && opt != 1) {
            cout << "请先创建一个矩阵" << endl;
            continue;
        }
        switch (opt) {
        case 1: {
            int row, col, cnt;
            cout << "请输入行数,列数,非零元个数" << endl;
            while (true) {
                cin >> row;
                cin >> col;
                cin >> cnt;
                if (row * col < cnt) 
                    cout << "输入错误,非零元个数要小于行数乘以列数,请重新输入" << endl;
                else
                    break;
            }

            tsMatrix = TSMatrix(row, col, cnt);
            hasMatrix = true;
            tsMatrix.creatMatrix();
            cout << "矩阵创建成功! " << endl;
            break;
        }
        case 2: {
            hasMatrix = false;
            cout << "矩阵销毁成功!" << endl;
            break;
        }
        case 3: {
            tsMatrix.print(); break;
        }
        case 4: {
            tsMatrix.transpose().print(); break;
        }
        case 5: {
            tsMatrix.quickTranspose().print(); break;
        }
        case 6:flag = false;
        }
        cout << endl;
    }


}

void showMain() {
    cout << "1.创建矩阵" << endl
        << "2.销毁矩阵" << endl
        << "3.输出矩阵" << endl
        << "4.转置矩阵" << endl
        << "5.快速转置矩阵" << endl
        << "6.退出" << endl;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值