一般都是采用顺序存储的方式来表示数组。
两种顺序储存方式
- 以行序为主序存储
- 以列序为主序储存
无论是行优先还是列优先
- 开始节点的存放地址
- 维数和每维的上下界
- 每个数组元素所占用的空间数
多维数组时
行优先:从右到左
列优先:从左到右
矩阵的压缩存储
为多个相同的非零元素只分配一个存储空间,对零元素不分配空间。
对称矩阵
三角矩阵
对角矩阵
稀疏矩阵
template <class T>
struct Triple
{
int i; //该非零元的行下标
int j; //该非零元的列下标
T e; //该非零元的值
};//三元组类型
template <class T>
class TSMatrix
{
public:
Triple<T> data[MAXSIZE+1];
int rows; //行数值
int cols; //列数值
int nums; //该非零元素的个数
public:
TSMatrix();
~TSMatrix();
Status InitMatrix(T *A, int rows, int cols);
Status TransMatrix(TSMatrix &M);
Status FastTransMatrix(TSMatrix &M);
Status DispMatrix(char name);
};
//矩阵转置算法实现
template <class T>
Status TSMatrix<T>::TransMatrix(TSMatrix &M)
{
//采用三元组表方式存储,实现矩阵的转置
rows = M.cols;
cols = M.rows;
nums = M.nums;
if(nums != 0)
{
int q = 0; //新三元组表T中的元素下标
//按M的列序号由小到大转化
for(int col=0; col<M.cols; col++)
{
for(int p=0; p<M.nums; ++p)
{
//在三元组顺序表M中查找列下标等于col者
if(M.data[p].j == col)
{
data[q].i = M.data[p].j;
data[q].j = M.data[p].i;
data[q].e = M.data[p].e;
q++;
}
}
}
}
return OK;
}