实现对称矩阵以及压缩存储

对称矩阵压缩存储
压缩矩阵:对称矩阵存储时只需要存储上三角或下三角的数据,所以最多存储 n*(n+1)/2个数据。
在存数据的 时候我们只需要将一半的数据存入一个一维数组中:
当然包含对角线元素
实现对称矩阵以及压缩存储_第1张图片
如果我们想要通过保存的这个一维数组的内容打印出二维数组的内容那么就要根据极具特色的行和列
实现对称矩阵以及压缩存储_第2张图片

#include
#include
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; ifor (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;
}

你可能感兴趣的:(数据结构)