数组和稀疏矩阵
数组
数组的基本概念
从逻辑结构上看,一维数组A是n(n>1)个相同类型数据 元素a1、a2、…、an构成的有限序列,其逻辑表示为:A=(a1,a2,…,an)其中,ai(1≤i≤n)表示数组A的第i个元素。
数组的存储结构
将数组的所有元素存储在一块地址连续的内存单元中,这是一种顺序存储结构;
几乎所有的计算机语言都支持数组类型,以C/C++语言为例, 其中数组数据类型具有以下性质
1. 数组中的元素数目固定
2. 数组中的所有数组元素具有相同的数据类型
3. 数组中的每个元素都有一组唯一的下标
4. 数组是一种随机存储结构,可随机存取数组中的任意数据元素
LOC(ai)=LOC(a1)+(i-1)*k (0≤i≤n)
对于一个m行n列的二维数组A(m×n) 存储方式有
- 以行序为主序的存储
- 以列序为主序的存储
特殊矩阵的压缩存储
特殊矩阵主要形式有
- 对称矩阵
- 上三角矩阵/下三角矩阵
- 对角矩阵
但是它们都是方阵,即行数和列数相等
1.对称矩阵的压缩存储
若一个n阶方阵A[n][n]中的元素满ai,j=aj,i(0≤i,j≤n-1),则称其为n阶对称矩阵
2.三角矩阵的压缩存储
3.对角矩阵的压缩存储
稀疏矩阵
一个阶数较大的矩阵中的非零元素个数s相对于矩阵元素的总个数t十分小时,即s<<t,该矩阵成为稀疏矩阵
1. 稀疏矩阵的三元组表示方法
稀疏矩阵中的每一个非零元素需由一个三元组:(i ,j ,ai,j)唯一确定,稀疏矩阵中的所有非零元素构成三元组线性表。
#include "stdio.h"
#include <corecrt_malloc.h>
#define MaxSize 100 //矩阵中非零元素的最大个数
constexpr auto M = 6;
constexpr auto N = 7;
//存放一个非零元素
typedef struct TupNode {
int r; //行号
int c; //列号
int d; //元素值
}TupNode, * pTupNode; //三元组定义(1,2,a12) (2,3,a23)
//存放整个稀疏矩阵
typedef struct TSMatrix {
int rows; //行数值
int cols; //列数值
int nums; //非零元素个数
TupNode data[MaxSize]; //三元组
}TSMatrix, * pTSMatrix; //三元组顺序表定义
//先创建三元组
void Create(pTSMatrix t, int arr[M][N]) {
int i, j;
t->rows = M;
t->cols = N;
t->nums = 0;
for (i = 0; i < t->rows; i++) {
for (j = 0; j < t->cols; j++) {
if (arr[i][j] != 0) {
t->data[t->nums].r = i;
t->data[t->nums].c = j;
t->data[t->nums].d = arr[i][j];
t->nums++;
}
}
}
}
//输出三元组
void Disp(pTSMatrix t) {
if (t->nums <= 0)
return;
for (int i = 0; i < t->nums; i++)
printf("\t%d\t%d\t%d\n", t->data[i].r, t->data[i].c, t->data[i].d);
}
void main() {
pTSMatrix t;
t = (pTSMatrix)malloc(sizeof(TSMatrix));
int arr[M][N] = {
{0,0,1,0,0,0,0},
{0,2,0,0,0,0,0},
{3,0,0,0,0,0,0},
{0,0,0,5,0,0,0},
{0,0,0,0,6,0,0},
{0,0,0,0,0,7,4}
};
Create(t, arr);
Disp(t);
}
输出结果为:
未完待续----