看王道的书讲到对称矩阵压缩存储,一直觉得应该是二维数组,结果竟然是一维数组,有点晕,最后查资料终于搞懂了。
资料来源:https://blog.csdn.net/persistence_s/article/details/70272896
对于下图这样的对称矩阵,重复的部分只存储一次就可以了。
那为什么是一维数组呢???
看到这个图,恍然大悟!!!
代码测试:
#include<iostream>
#include<stdlib.h>
using namespace std;
class Special_Matrix
{
public:
friend ostream& operator<<(ostream&_cout, Special_Matrix& s);
Special_Matrix(int Row, int Col)
:_row(Row)
, _col(Col)
, _pData(NULL)
{
}
~Special_Matrix()
{
if (_pData)
{
delete[]_pData;
_pData = NULL;
}
}
void Init_Special_Matrix()
{
_pData = new int[_row*(_col + 1) / 2];
}
void Assign_Special_Matrix(int e, int i, int j)//设置这个特殊矩阵
{
if (i >= j)
{
_pData[i*(i + 1) / 2 + j] = e;
}
else
{
swap(i, j);
_pData[i*(i + 1) / 2 + j] = e;
}
}
int Value(int i, int j)
{
if (i >= j)
return _pData[(i*(i + 1)) / 2 + j];
else
{
swap(i, j);
return _pData[(i*(i + 1)) / 2 + j];
}
}
private:
int _row;
int _col;
int *_pData;
};
ostream& operator<<(ostream&_cout, Special_Matrix& s)
{
for (int i = 0; i<s._row; i++)
{
for (int j = 0; j < s._col; j++)
{
_cout << s.Value(i, j) << " " << " ";
}
_cout << endl;
}
return _cout;
}
void FunTest()
{
Special_Matrix s(5, 5);
s.Init_Special_Matrix();
int d = 0;
for (int i = 0; i < 5; i++)
{
printf("输入第%d行的%d个数据元素: ", i + 1, i + 1);
for (int j = 0; j <= i; j++)
{
cin >> d;
s.Assign_Special_Matrix(d, i, j);//存下三角数据
}
}
cout << s;
}
int main()
{
FunTest();
system("pause");
return 0;
}