数组的定义
抽象数据类型
1 | ADT Array{ |
二维数组:
typedef ElemType Array2[m][n];
等价于
typedef ElemType Array1[n];
typedef Array1 Array2[m];
二维数组的两种存储方式:
以行序为主序:LOC(i,j)=LOC(0,0)+(n×i+j)×L
以列序为主序:LOC(i,j)=LOC(0,0)+(m×j+i)×L
数组的顺序存储表示:
1 |
|
矩阵的压缩存储:
为多个相同的非零元素分配一个存储空间;对零元素不分配空间
1.特殊矩阵:
指值相同的元素或者零元素在矩阵中的分布有一定规律
2.稀疏矩阵:
一个矩阵中若其非零元素的个数远远小于零元素的个数,则该矩阵称为稀疏矩阵
抽象数据类型:
1 | ADT SpareseMatrix{ |
a.三元组顺序表:
1 |
|
图示:
b.行逻辑链接的顺序表:
1 | typedef struct{ |
c.十字链表:
1 | typedef struct OLNode{ |
图示:
3.三角矩阵:
上三角矩阵
下三角矩阵
4.对称矩阵:
n^2个元二维数组压缩存储到n(n+1)/2个元的一位数组
k=
{ i(i-1)/2+j-1 当i≥j
{ j(j-1)/2+i-1 当i<j
图示:
广义表
广义表的定义:
LS=(a1,a2,…,an)
n为广义表的长度
ai可以是单个元素,也可以是广义表,
分别成Wie广义表LS的原子和字表
当广义表非空时,称第一个元素a1为LS的表头(Head),称其余元素组成的表(a2,…,an)是LS的表尾(Tail)
图示:
GetHead(D)=A, GetTail(D)=(B,C),GetHead((B,C))=B, GetTail((B,C))=(C)
()和(())不同,前者为空表,长度为0,后者长度为1,可分解为表头、表尾均为空表()
结论:
1.列表的元素可以是子表,子表的元素还可以是子表图表示,圆圈表示列表,方块表示原子
2.列表可以是一个递归的表,即列表也可以是其本身的一个子表例如E=(a,E),相当于E=(a,(a,(a,…)))
存储结构:
1.头尾链表存储表示:
1 | typedef enum{ATOM,LIST}ElemTag; //ATOM==0;原子,LIST==1;子表 |
2.扩展线性链表存储表示:
1 | typedef enum{ATOM,LIST}ElemTag; //ATOM==0;原子,LIST==1;子表 |
三元组代表
1 |
|
十字链表代码
1 |
|