1. 数组
基本概念
一维数组是n个相同类型数据元素构成的有限序列,其实就是一种线性表。
二维数组可以看做是每个数据元素都是相同类型的一维数组的一维数组。二维数组是线性结构,可以看做线性表,但就二维数组的形状而言,又是非线性结构。
数组的基本运算:元素赋值;取元素值;输出所有元素值。
数组的存储结构
将数组的所有元素存储在一块地址连续的内存单元中,是一种顺序存储结构。
一维数组:
a
1
a_1
a1的存储地址为
L
o
c
(
a
1
)
Loc(a_1)
Loc(a1),每个数据元素占用k个存储空间,则
L
o
c
(
a
i
)
=
L
o
c
(
a
1
)
+
(
i
−
1
)
∗
k
Loc(a_i)=Loc(a_1)+(i-1)*k
Loc(ai)=Loc(a1)+(i−1)∗k.
m行n列的二维数组:
(1)以行序为主序的存储方式,即
a
11
,
.
.
.
.
.
.
,
a
1
n
,
.
.
.
.
.
,
a
i
1
,
.
.
.
.
.
.
,
a
i
n
,
.
.
.
.
.
a
n
1
,
.
.
.
.
.
a
n
n
.
a_{11},......,a_{1n},.....,a_{i1},......,a_{in},.....a_{n1},.....a_{nn}.
a11,......,a1n,.....,ai1,......,ain,.....an1,.....ann.则
L
o
c
(
a
i
j
)
=
L
o
c
(
a
11
)
+
[
(
i
−
1
)
∗
n
+
(
j
−
1
)
]
∗
k
Loc(a_{ij})=Loc(a_{11})+[(i-1)*n+(j-1)]*k
Loc(aij)=Loc(a11)+[(i−1)∗n+(j−1)]∗k;
(2)以列序为主序,即
a
11
,
.
.
.
.
.
.
,
a
m
1
,
.
.
.
.
.
,
a
1
i
,
.
.
.
.
.
.
,
a
m
i
,
.
.
.
.
.
a
1
n
,
.
.
.
.
.
a
n
n
.
a_{11},......,a_{m1},.....,a_{1i},......,a_{mi},.....a_{1n},.....a_{nn}.
a11,......,am1,.....,a1i,......,ami,.....a1n,.....ann.,则
L
o
c
(
a
i
j
)
=
L
o
c
(
a
11
)
+
[
(
j
−
1
)
∗
m
+
(
i
−
1
)
]
∗
k
Loc(a_{ij})=Loc(a_{11})+[(j-1)*m+(i-1)]*k
Loc(aij)=Loc(a11)+[(j−1)∗m+(i−1)]∗k.
特殊矩阵的压缩存储
对称矩阵:以行序为主序存储其下三角+主对角线的元素。
B
=
(
a
00
,
a
10
,
a
11
,
.
.
.
.
.
.
,
a
n
−
1
,
0
,
.
.
.
.
.
.
,
a
n
−
1
,
n
−
1
)
B=(a_{00},a_{10},a_{11},......,a_{n-1,0},......,a_{n-1,n-1})
B=(a00,a10,a11,......,an−1,0,......,an−1,n−1),
a
i
j
a_{ij}
aij前面有
i
(
i
+
1
)
/
2
+
j
i(i+1)/2+j
i(i+1)/2+j个元素。
L
o
c
(
a
i
j
)
=
L
o
c
(
a
11
)
+
[
i
(
i
+
1
)
/
2
+
j
]
∗
k
Loc(a_{ij})=Loc(a_{11})+[i(i+1)/2+j]*k
Loc(aij)=Loc(a11)+[i(i+1)/2+j]∗k.
上三角矩阵:
B
=
(
a
00
,
a
01
,
.
.
.
.
.
.
.
,
a
0
,
n
−
1
,
.
.
.
.
.
,
a
n
−
1
,
n
−
1
)
B=(a_{00},a_{01},.......,a_{0,n-1},.....,a_{n-1,n-1})
B=(a00,a01,.......,a0,n−1,.....,an−1,n−1),当
i
<
=
j
i<=j
i<=j时,
a
i
j
a_{ij}
aij前面有
i
(
2
n
−
i
+
1
)
/
2
+
j
−
i
i(2n-i+1)/2+j-i
i(2n−i+1)/2+j−i个元素。
L
o
c
(
a
i
j
)
=
L
o
c
(
a
11
)
+
[
i
(
2
n
−
i
+
1
)
/
2
+
j
−
i
]
∗
k
Loc(a_{ij})=Loc(a_{11})+[i(2n-i+1)/2+j-i]*k
Loc(aij)=Loc(a11)+[i(2n−i+1)/2+j−i]∗k;当
i
>
j
i>j
i>j时,
a
i
j
a_{ij}
aij是常量,存放在
n
(
n
+
1
)
/
2
n(n+1)/2
n(n+1)/2的位置。
上三角矩阵:
B
=
(
a
00
,
a
10
,
a
11
,
.
.
.
.
.
.
,
a
n
−
1
,
0
,
.
.
.
.
.
.
,
a
n
−
1
,
n
−
1
)
B=(a_{00},a_{10},a_{11},......,a_{n-1,0},......,a_{n-1,n-1})
B=(a00,a10,a11,......,an−1,0,......,an−1,n−1),当
i
>
=
j
i>=j
i>=j时,
a
i
j
a_{ij}
aij前面有
i
(
i
+
1
)
/
2
+
j
i(i+1)/2+j
i(i+1)/2+j个元素。
L
o
c
(
a
i
j
)
=
L
o
c
(
a
11
)
+
[
i
(
i
+
1
)
/
2
+
j
]
∗
k
Loc(a_{ij})=Loc(a_{11})+[i(i+1)/2+j]*k
Loc(aij)=Loc(a11)+[i(i+1)/2+j]∗k.当
i
<
j
i<j
i<j时,
a
i
j
a_{ij}
aij是常量,存放在
n
(
n
+
1
)
/
2
n(n+1)/2
n(n+1)/2的位置。
2. 稀疏矩阵
定义:非零元素个数相对于矩阵元素总数十分小时。
稀疏矩阵的三元组表示
每个非零元素由三元组
(
i
,
j
,
a
i
j
)
(i,j,a_{ij})
(i,j,aij)唯一确定,所有非零元素构成三元组线性表。
把稀疏矩阵的三元组线性表按顺序存储结构存储,则称为系数矩阵的三元组顺序表。
创建三元顺序表
#include <iostream>
using namespace std;
#define MaxSize 100
#define M 3
#define N 4
typedef struct
{
int r;//行号
int c;//列号
int d;//元素值
}TupNode;//三元组定义
typedef struct
{
int rows;//行数
int cols;//列数
int nums;//非零元素个数
TupNode data[MaxSize];
}TSMatrix;//三元组顺序表定义
void CreatMat(TSMatrix &t,int (*p)[N])//二维数组作为形参,也可用int p[M][N]或者int [][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 (p[i][j]!=0)
{
t.data[t.nums].r = i;
t.data[t.nums].c = j;
t.data[t.nums].d = p[i][j];
t.nums++;
}
}
}
}
int main()
{
int A[3][4]={{0,1,0,0},{0,0,1,0},{0,0,0,0}};
TSMatrix t;
CreatMat(t,A);
cout << t.nums << endl;
return 0;
}
稀疏矩阵的十字链表表示
每个非零元素对应一个节点。