#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;
}
实验6、压缩矩阵的2种转置运算
最新推荐文章于 2022-12-07 07:55:30 发布