一、数组
1.1 数组的定义
(略)
1.2 数组的顺序表示
(略)
1.3 矩阵的压缩存储
所谓压缩存储指的是:为多个值相同的元只分配一个存储空间;对零元素不分配空间。
1.3.1特殊矩阵
对称矩阵、三角矩阵、对角矩阵。主要用到数学的矩阵概念,通过发现规律,整理出公式,然后进行存储。
1.3.2 稀疏矩阵
1.3.2.1 三元组顺序表
三元组:(i,j,aij)唯一确定了矩阵的一个非零元素。i:行,j:列,aij值。以顺序存储结构来表示三元组表,则可得稀疏矩阵的一种压缩存储方式,即三元组顺序表。
1.3.2.2 行逻辑链接的顺序表
为了便于随机存取任意一行的非零元,则需知道每一行的第一个非零元在三元组表中的位置。
1.3.2.3 十字链表
当矩阵的非零元个数和位置在操作过程中变化较大时,就不宜采用顺序存储结构表示三元组的线性表。
结点:1. 存储的值:行、列、值;2. 指针:指向下一行非零元素、指向下一列非零元素
二、广义表
2.1 广义表的定义
广义表是线性表的推广。也有人称其为列表。
LS = (a1,a2,…,an)
其中,LS是广义表的名称,n是广义表的长度。在线性表的定义中,ai(1<=i<=n)只限于是单个元素。而在广义表的定义中,ai可以是单个元素,也可以是广义表,分别成为广义表LS的原子和字表。习惯上,用大写字母表示广义表的名称,用小写字母表示原子。当广义表LS非空时,称第一个元素ai为LS的表头,称其余元素组成的表时LS的表尾。
举例:
(1)A=() A是一个空表,它的长度为零;
(2)B=(e) B只有一个原子e,B的长度为1;
(3)C=(a,(b,c,d)) C的长度为2,两个元素分别为原子a和子表(b,c,d);
(4)D=(A,B,C) D的长度为3,三个元素都是列表。显然,将字表的值代替后,则有D=((),(e),(a,(b,c,d)));
(5)E=(a,E) 这是一个递归的表,长度为2。
2.2 广义表的存储结构
2.2.1 广义表的头尾链表存储表示
一个表结点可以有三个域组成:标志域、指示表头的指针域和指示表尾的指针域;而元祖结点只需两个域:标志域和值域。
表结点:
原子结点:
举例:
2.2.2 广义表的扩展线性链表存储表示
表结点:
原子结点:
举例:
2.3 广义表的递归算法
由于递归函数的设计用的是归纳思维的方法,则在设计递归函数时,应注意:(1)首先应书写函数的首部和规则说明,严格定义函数的功能和接口(递归调用的界面),对求精函数中所得的和原问题性质相同的子问题,只要接口一致,便可进行递归调用;(2)对函数中的每一个递归调用都看成只是一个简单的操作,只要接口一致,必能实现规格说明中定义的功能,切忌想得太远太深。
两个广义表的例子:求广义表的深度和复制广义表。
2.4 广义表实例
一个m元多项式用广义表表示,步骤如下:先分解出一个主变元,随后再分解出第二个变元,等等。由此,一个m元的多项式首先是它的主变元的多项式,而其系数又是第二变元的多项式,由此可用广义表来表示m元多项式。
例:P(x,y,z)= x10y3z2 + 2x6y3z2 + 3x5y2z2 + x4y4z + 6x3y4z + 2yz + 15
广义表表示:
P = z((A,2),(B,1),(15,0))
A = y((C,3),(D,2))
C = x((1,10),(2,6))
D = x((3,5))
B = y((E,4),(F,1))
E = x((1,4),(6,3))
F = x((2,0))
结点:exp为指数域,coef为系数域,hp指向其系数子表,tp指向同一层的下一结点。
表结点:
原子结点: