线性表:由0个或者多个数据元素组成的有限序列。属于1vs1的关系
强调:
1.首先是序列,元素之间有先后顺序。
2.第一个元素无前驱,最后一个无后继。其它元素都有且一个前驱和后继。
3.线性表是有限的,事实上,无论计算机发展到多强大,它处理的元素都是有限的。
数据类型:指一组性质相同的值的集合以及定义在此集合上的一些操作的总称。
例如:很多编程语言的整形,浮点型,字符型 这些就是数据类型。
为什么开辟数据类型?
内存不是无限大的,可以按照数据类型开辟不同的空间。所以可以按照数据类型适应不同的条件。
抽象:指抽像出事物具有普遍性的本质。抽象是思考问题的方式,隐藏了繁杂的细节内容。
例如:计算机计算1+1=2 我们不用考虑计算机内部进行的操作。
抽象数据类型ADT:实质一个数学模型已经定义在该模型上的一组操作。也就是把数据类型和相关操作进行整合,捆绑在一起。
例如:一个3D游戏中定义一个位置,我们就可以抽象出一个(x,y,z)的坐标
抽象数据类型的格式:
ADT 抽象数据类型名
Data
数据元素之间逻辑关系的定义
Operation
操作 (创建,判断为空,清空,删除,插入,返回第I个位置的元素,返回第i个元素的位置)
endADT
线性表的顺序存储结构:用一段地址连续的存储单元依次存储线性表的数据。
物理上讲:就是在内存中找个初始地址,然后通过占位的形式,把一定的内存空间给占了,然后把相同数据类型的数据元素一次放在这块空地中。
特点:如果是顺序,即使没有数据,该位置为了连续,空着位置也不会被占用。
属性:起始位置,最大存储容量,线性表的当前长度。
各种编程语言中的数组即是一种线性表。
地址计算方法:loc(ai)=loc(a1)+(i-1)*c,这个地址的时间性能属于o(1),所以速度最快。
线性表的操作算法
插入算法的思路:从最后一个数组元素开始遍历到需要插入的位置,往后移动一个位置
删除算法:从删除的位置开始遍历到最后,向前移动一个位置。
对比时间复杂度。
如果插入和删除的位置都是在最后一个位置:o(1)
都在第一个位置:o(n),n指长度
存和读数据都是o(1),插入和删除都是o(n),所以线性表适合元素个数比较稳定,不经常插入和删除操作。
优点:可以快速的存储表中任意位置的元素,无需为表中元素之间的逻辑关系而增加额外的存储空间。
缺点:插入和删除需要需要移动大量元素,当线性表长度变化较大时难以 确定存储空间的容量,容易造成存储空间的碎片。
线性表的链式存储结构:
特点:一组在内存中未被占用的任意存储单元。存储数据元素,同时存储它的后继元素的存储地址。
在链式存储结构的存储单元上。我们把存储数据元素信息的域叫做数据域,把存储直接后继位置的与成为指针与。指针域中存储的信息成为指针或链。这两部分组成数据元素称为存储映像,成为结点。
分类:
单链表:头节点数据域无信息但也可以存放链表的长度,头指针冠以链表的名称,是必须存在的
链表的读取:时间复杂度最坏为o(n)
插入:此时要在插入位置的指针做一下改变即可。时间复杂度o(n)
删除:在删除的位置对指针做改变。时间复杂度o(n)
效率对比:从时间复杂度来讲,时间复杂度都是o(n)。效率并没有提升,可是如果插入多条元素,单链表的第一次插入时间复杂度为o(n),以后每一次都是O(1),而顺序存储结构每次都为o(n),很显然,对于插入和删除频繁的操作,单链表的效率就越是明显。
单链表的整体创建:单链表是一个动态生成的过程。从空表的初始状态开始,依次建立。分为头插法和尾插法。
单链表结构与顺序存储结构优缺点:
存储分配方式,时间性能,空间性能三个方面总结。
静态链表:是为了给没有指针的编程语言设计的一种实现单链表功能的方法。
循环链表:将单链表中的终结结点指针由空指针指向头结点,问题就解决了。
判断单链表是否有坏的算法:p,q指针向前走,p一直走,q从头走。只要不相等时,说明存在环。单链表有坏。
双向链表:记单链表的基础上实现相互指针指向。