百度题库旨在为考生提供高效的智能备考服务,全面覆盖中小学财会类、建筑工程、职业资格、医卫类、计算机类等领域。拥有优质丰富的学习资料和备考全阶段的高效服务,助您不断前行!
线性表:由n(n>=0)个具有相同类型的元素组成的优有限序列。除第一个元素外,每个元素有且只有一个直接前驱,除最后一个元素外,每个元素有且只有一个直接后继。
按存储结构可分为定长的顺序存储结构(即顺序表)和变长的现行存储结构(即链表)。
使用C语言描述线性表数据结构。
1、 特点:顺序表通过创建数组来建立,为线性表分配一块连续的存储空间,线性表中的数据元素顺序地存储在这些地址连续的空间中,即所谓的逻辑相邻,物理相邻。
2、设每个数据元素占用d个存储空间,第一个元素内存地址为Loc(a1),则第i个数据元素的内存地址为Loc(ai)+d(i-1)
3、 定义一个线性表:
用数组实现顺序表的存储结构,由于在实际操作中,要进行删除、插入等相关操作,即顺序表的长度是可变的,因此数组的容量需设计得足够大,用data[MAXSIZE]表示,顺序表中的数据元素从data[0]开始存放,采用变量last来记录当前线性表中最后一个元素在数组中的位置。因此,当last=-1时,就是一个空表。
//顺序表定义,包括一个表示最后元素的位置的last,和类型为elemtype的数组
插入时,确保顺序表有空闲的存储空间(判满);确保插入位置合法;插入完成后,有关数据元素后移,数组长度加1.
判断删除位置是否合法,删除位置i+1~n后移,数组长度减1.
由于顺序表是通过数组来建立存储结构,因此可通过下标值直接访问一个数据元素,其时间复杂度为O(1)。
从第一个数据元素开始,扫描顺序表,直至数据元素等于所要查找的值,返回数组下标。时间复杂度为O(n)。
方便随机访问表中的每一个元素;
不需要再为表示结点间的逻辑关系而增加额外的空间。
线性表(linear list) 是数据结构的一种,一个线性表是n
个具有相同特性的数据元素的有限序列。
a1
是a2
的前驱,ai+1
是ai
的后继,a1
没有前驱,an
没有后继
n
为线性表的长度 ,若n==0
时,线性表为空表
在JAVA
里面基本的顺序存储结构线性表
是数组
,ArrayList
是基于它来完成对象的存储,来分析一下ArrayList(Android里面的)
的源码
add()
的时候先判断当前数据容量是否足够,如果不足够那么扩容,扩容的值等于当前数组长度右移一位,也就是x2
,然后添加到指定位置即可。 addAll()
也是同样的方式,在这就不贴代码,可以自行查看一下源码。
remove
过程就是得到对应的值的下标,然后将该下标之后的数据都向前移动一个坐标,最后一个赋值为null
set()
直接将其赋值即可
get()
就直接将数组里面值取出来即可。
从源码的角度我们更加的熟悉了顺序线性表的优缺点:查询很快,插入和删除效率慢。
特点:用一组任意的存储单元存储线性表的数据元素,这组存储单元可以是连续的,也可以是不连续的。
优点:插入和删除效率高
插入和删除只需改变next
指向的地址即可,所以增删效率比较高。
如上图那样,如果需要查找第9个元素,那么将要从第一个一直指向第九个,所以查找效率低。
链式存储结构又包含循环链表、双向循环链表、单向循环链表等。 单向循环链表就是上图那样的,一个指针对应下一个指针,直到结束,就如上面的那张图所示。 循环链表 : 将单链表中终端结点的指针端由空指针改为指向头结点,就使整个单链表形成一个环,这种头尾相连的单链表称为单循环链表,简称循环链表
双向循环链表: 双向循环链表是单向循环链表的每个结点中,再设置一个指向其前驱结点的指针域
在LinkedList
里面有一个Node
类,这个类就是用来确定上一个指针prev
和下一个指针next
可以很直观的看出,add
的时候,将new
出一个新的Node
对象newNode
,然后把上一个Node
对象last
的next
指向它,然后又将last
重新赋值。当指定位置add
的时候,就需要先找个这个位置的Node
对象,然后更改next
和prev
即可。在指定下标插入的话那么将先判断这个下标是在前半段还是后半段,如果是前半段的话就从头开始next
遍历查找,如果是后半部的就从尾prev
遍历。add
操作如下图所示
和add
差不多,找出相应的Node
对象,然后重新对前后的Node
重新进行指向即可。
remove
主要操作所下图所示
判断这个下标是在前半段还是后半段,如果是前半段的话就从头开始next
遍历查找,如果是后半部的就从尾prev
遍历。
先查找Node
,然后重新赋值即可。
水平有限,文中有什么不对或者有什么建议希望大家能够指出,谢谢!