2.线性结构
2.1线性表及其实现
多项式的表示
方法1:顺序存储结构直接表示
数组各分量对应多项式各项
方法2:顺序存储结构表示非零项
按指数大小有序存储!
方法3:链表结构存储非零项
链表中每个几点存储多相持中的一个非零项,包括系数和指数两个数据域以及一个指针域
什么是线性表
多项式表示的问题的启示:
- 同一个问题可以有不同的表示(存储)方法
- 有一类共性问题:有序线性序列的组织和管理
线性表(Linear List):有同类型数据元素构成有序序列的线性结构- 表中元素个数成为线性表的长度
- 线性表没有元素时,成为空表
- 表起始位置称表头,表结束位置称表尾
线性表的抽象数据类型描述
类型名称:线性表(List)
数据对象集:线性表是n(>=0)个元素构成的有序序列
操作集:线性表L∈List,整数i表示位置,元素X∈ElementType,线性表基本操作主要有:
- List MakeEmpty(): 初始化一个空线性表;
- ElementType FindKth(int K, List L): 根据位序K,返回相应元素;
- int Find(ElementType X, List L): 在线性表L中查找X的第一次出现位置;
- void Insert(ElementType X, int i, List L): 在位序i前插入一个新元素X;
- void Delete(int i, List L): 删除指定位序i的元素;
- int Length(List L): 返回线性表L的长度n。
线性表的顺序存储实现
利用数组的连续存储空间存放线性表的各元素
线性表的联诗存储实现
不要求逻辑上相邻的两个元素物理商业相邻;通过“链”建立起数据元素之间的逻辑关系
插入、删除不需要移动数据元素,只需要修改“链”。
广义表(Generalized List)
多重链表:链表中的节点可能同时隶属于多个链
-
多重链表中节点的指针域会有多个,如前面例子包含了Next和SubList两个指针域;
-
但包含两个指针域的链表并不一定是多重链表,比如双向链表不是多重链表。
-
多重链表有广泛的用途:基本上如树、图这样相对复杂的数据机构都**可以采用多重链表方式实现存储。
矩阵可以用二维数组表示,但二维数组表示有两个缺陷:- 一是数组的**大小需要事先确定,
- 对于“稀疏矩阵”,将造成大量的存储空间浪费。
分析:采用一种典型的多重链表——十字链表来存储稀疏矩阵
-
只存储矩阵非0元素项
-
结点的数据域:行坐标Row、列坐标Col、数值Value
-
每个结点通过两个指针域,把同行同列串起来;
- 行指针(或称为向右指针)Right
- 列指针(或称为乡下指针)Down