总结五:数据结构-数组和广义表

一、数组

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指向同一层的下一结点。

表结点:

原子结点:

猜你喜欢

转载自blog.csdn.net/LittleFlown/article/details/84075163