您的位置:首页 > 理论基础 > 数据结构算法

数据结构学习笔记——2.线性表及实现

2020-08-17 17:18 1016 查看

二、线性表
引例:多项式的保存
方法一:顺序存储结构直接表示
用数组来保存系数,下标作为指数
缺点:当系数中含有0时,数组占用空间大且做无效运算
方法二:顺序存储结构表示非零项
用结构数组同时保存系数和指数
多项式相加过程:将两个多项式用指数递降的顺序储存,依次比较首项的幂大小,相同就相加,不同就输出指数高的,然后再依次用小的一项比较另一个多项式的第二项
方法三:链表结构存储非零项
链表中每个节点存储多项式中的一个非零项,包括系数和指数两个数据域以及一个指针域
多项式相加过程:将两个多项式用指数递降的顺序储存,依次用操作指针指向各个节点比较首项的幂大小,相同就相加,不同就输出指数高的,然后再依次用小的一项比较另一个多项式的第二项

线性表:由同类型数据元素构成有序序列的线性结构
表中元素个数称为线性表的长度
线性表没有元素时,称为空表
表的起始位置称为表头,表的结束位置称为表尾

线性表的抽象数据类型描述:
数据对象集:线性表是n(n>=0)个元素构成的有序序列
操作集:线性表L∈List,整数i表示位置,元素X∈ElementType,线性表基本操作主要有:
初始化空表
在表中寻找位置为k的元素
查找指定元素的位置k
插入
删除
返回线性表长度n

线性表的存储方法
1.顺序存储:利用结构体数组的连续存储空间顺序存放线性表的各元素
初始化:
查找:
插入:先要判断表是否是满的,再把指定位置后面的元素全部向后挪一位,
从后向前移动,再将x放入目标位置 ,尾指针指向新的最后一个元素
删除:先删除目标元素,再按从左向右的顺序向前挪动后面的元素,尾指针指向新的最后一个元素
返回线性表长度:数组最后一个元素下标+1
2.链式存储:利用链表的链接建立起数据元素之间的逻辑关系
初始化
查找:(1)按序号查找:遍历法,设立操作指针p和计数器i=0,使p从头指针遍历至尾指针,依次查找,查找条件为p!=NULL&&i<k
(2)按值查找:遍历法,已知目标元素,设立操作指针p和计数器i,使p从头指针遍历至尾指针,依次比较,循环条件为p!=NULL&&p->Data!=X
插入:链表的插入需要知道前面一个节点是什么,所以插入都插在某一个节点后面,先判断插入的位置是否为表头,若是表头则直接连接后续节点并返回表头,若不是表头则开始遍历,若超出表尾则返回错误
删除:删除也需要找到前一个节点,将前一个节点指向目标节点的下一个节点,将目标节点释放,防止内存空间泄露,先判断删除的是不是头节点,若是则要判断头节点是否为空,若不是则开始遍历,若超出表尾则返回错误
返回线性表长度:遍历链表,设立操作指针p和一个计数器i=0,使p从头指针遍历至尾指针,计数器依次i+1,循环条件为p->next不为NULL

广义表
引例:一元多项式可用如上方法表示,那么二元多项式如何表示
分析:将二元多项式看成关于x的一元多项式,则二元多项式可化为系数中包含y的一元多项式,用“复杂”链表表示
广义表是线性表的推广
对于线性表而言,n个元素都是基本的单元素
广义表中,这些元素不仅可以是单元素也可以是另一个广义表,由此,一个域可能为单元素,也可能为一个指针,因此在C语言中有一个数据类型“联合(Union)”,Union可以把不同数据类型结合在一起,使用标记的方法区别单元素或者指针

多重链表:链表中的节点可能同时隶属于多个链
多重链表中节点的指针域(即一个节点中包含的指针)可能会有多个,但包含两个指针域的链表不一定是多重链表,如双向链表
多重链表有广泛的用途,如树、图这样相对复杂的数据结构都可以采用多重链表方式实现存储

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: