数据结构和算法学习--线性表(List)

线性表(List):由零个或多个数据元素组成的有限序列(当0个元素时称为空表)
强调:1.他是一个序列,有先后顺序
2.第一个元素前无前驱,最后一个元素后无后继,其他元素有且只有一个前驱和一个后继
3.线性表强调是有限的

数据类型:指一组性质相同的值的集合及定义在此集合上的一些操作的总称
抽象:指抽取出事物具有的普遍性的本质。它要求抽出问题的特征而忽略非本质的细节,是对具体事物的一个概况。抽象是一种思考问题的方式,它隐藏了繁杂的细节。

我们对已有的数据类型进行抽象,就有了抽象数据类型
抽象数据类型是指一个数学模型及定义在该模型上的一组操作
抽象数据类型的定义仅取决于它的一组逻辑特性,而与其在计算机内部如何表示和实现无关。
比如1+1=2,在不同cpu上处理可能不同,但由于数学特性相同,所以在计算机编程者看来他们是相同的
抽象的意义在于数据类型的数学抽象特性
而且抽象数据类型不仅仅指那些已经定义并实现的数据类型,还可以是计算机编程者在设计软件程序时自己定义的数据类型。比如3D游戏中,自定义的point点自定义的x,y,z。

描述抽象数据类型的标准格式:
ADT 抽象数据类型名
Data
数据元素之间逻辑关系
Operation
操作
endADT

线性表的一些操作:
InitList:初始化,建立一个空的线性表
ListEmpty:判断线性表是否为空,空返回true
ClearList:清空线性表
GetElem:查询指定位置的元素
LpcateElem:查找指定元素
ListInsert:指定位置插入新元素
ListDelete:指定位置删除元素
ListLength:返回线性表包含的元素个数

线性表有两种物理存储结构:顺序存储结构和链式存储结构
顺序存储结构:用一段地址连续的存储单元依次存储线性表的数据元素(比如数组)
顺序存储结构封装需要三个属性:1.存储空间的起始位置 2.线性表的最大存储容量 3.线性表的当前长度
顺序存储结构线性表的第i个元素和第i+1个元素的存储地址关系(c为线性表的抽象数据类型占用的内存大小)
LOC(ai+1)=LOC(ai)+c
查询顺序存储结构线性表不管第一个还是最后一个都只需要单纯计算内存即可,因此其存储时间性能(时间复杂度)为O(1),通常称为随机存储结构
其插入和删除的时间复杂度(最坏情况)由于需要移动元素,因此时间复杂度为O(n)
因此比较适合元素个数比较稳定,不长插入和删除元素,擅长存储和查询元素。
优点:无需为表示表中元素之间的逻辑关系而增加额外的存储空间。可快速存取表中
任意位置的元素
缺点:插入和删除需要移动大量元素。当线性表长度变化较大时,难以确定存储空间
的容量。容易造成存储空间的“碎片”。(因为是一大片一大片申请存储空间)

链式存储结构:用一组任意的存储单元存储线性表中的数据元素,称为线性表的链式存储结构。它的存储单元可以是连续的,也可以是不连续的。除了存储其本身的信息之外,还需存储一个指示其直接后继的信息(即直接后继的存储位置),这两部分信息组成数据元素的存储映像,称为结点(node)。
链表的第一个节点的存储位置叫做头指针,最后一个节点指针为null
一般来说,头节点的数据域不存储任何信息。
头指针是链表指向第一个节点的指针,若链表有头指针,则是指向头节点的指针
头指针有标识作用,所以常用头指针冠以链表的名字
头节点是为了操作的统一和方便而设立的,放在第一个元素的结点之前
在链表中由于无法知道第i个元素的位置,因此链表的查询是比顺序存储结构复杂度。查询的时间复杂度为O(n)。 而且不方便使用for循环来控制。
链表的插入只需要改变要插入位置的前后节点的指向即可。(单链表的插入要注意顺序,顺序不正确会造成死循环)(链表的删除要小心断开链接,有时看似删除了但是却只是单方向的无法索引到,但还是存在的)
链表的插入效率高,插入及删除的时间复杂度为O(1)。但是查找的时间复杂度为O(n)。
单链表的整表创建,先创建空链表,之后依次往上添加
头插法:每个新添加的元素都添加到链表的第一个(生活中的插队)。缺点是顺序会反
尾插法:新节点插入到最后

当不打算使用这个单链表时,进行整表的删除,也就是内存中释放掉,留出更多的空间。整体思路:声明节点p和q,将第一个节点赋值给p,第二个节点赋值给q,循环执行释放p和将q赋值给p的操作

单链表和顺序存储结构优缺点对比:
存储分配方式:顺序存储结构采用连续的存储单元依次存储线性表的数据元素。链表采用链式存储结构不需连续存储单元
时间性能:查找:顺序存储结构O(1),单链表O(n)。插入和删除:顺序存储结构O(n),单链表O(1)。
空间性能:顺序存储结构需要预先分配空间。分大了容易空间浪费,分小了容易发生溢出。单链表不需要预先分配存储空间。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值