数组
特点
数组的特点:结构固定,定义后维数和维界不变。数组可以是多维,但存储空间是一维的,所以重点在解决映射关系。注意数组中元素位置的计算。
三维数组按页优先的顺序存储
特殊矩阵的压缩存储
1.对称矩阵压缩为只用存储下/下三角(包括对角线元素)
个元素←→ n(n+1)/2元素
a[i][j] ←→ b[k]数组下标0开始
2.三角矩阵的压缩
n²个元素←→ n(n+1)/2+1元素,常数c共享一个元素存储空间故+1
3.对角矩阵的压缩存储
当b=1时称为三对角矩阵。其压缩地址计算公式如下:k=2i+j
对于其他对角矩阵:可采用二维数组存储
稀疏矩阵的存储方式
三元组顺序表
稀疏矩阵中的每一个非零元素需由一个三元组:唯一确定,稀疏矩阵中的所有非零元素,通常再增加一个总体信息:总行数,总列数,非零元素总个数,构成三元组线性表。
优点:非零元再表中按行徐有序存储,便于进行依行顺序处理的矩阵运算
缺点:不能随机存取,若按行号存取某一行中的非零元,需从头开始查找
十字链表法
优点:能够灵活地插入运算后生成的非零元,删除产生的新零元,实现矩阵各种运算
行逻辑连接的顺序表
相关操作
定义
//将矩阵行列号也看作0开头与数组开头对应
typedef struct {
int r;//行号
int c; //列号
ElemType d;//元素值
}TupNode; //三元组定义
typedef struct {
int rows; //行数值
int cols; //列数值
int nums;//非零元素个数
TupNode data[MaxSize];
}TSMatrix; //三元组顺序表定义
从一个二维矩阵创建其三元组表示
void CreateMartix(TSMatrix& t, ElemType A[M][N]) {
int i, j;
t.rows = M; t.cols = N; t.nums = 0;
for (i = 0; i < M; i++) {
for(j = 0; j < N; j++) {
if (!A[i][j]) {
t.data[t.nums].r = i;
t.data[t.nums].c = j;
t.data[t.nums].d = A[i][j];
t.nums++;
}
}
}
}
三元组元素赋值
/******************
①将一个非0元素修改为另一个非0值
②将一个0元素修改为非0值,需要增加元素
*******************/
void Value(TSMatrix& t, ElemType e, int i, int j) {
if (i >= t.rows || j >= t.cols) return;
int k = 0, k1;
while (k<t.nums && i