数据结构可以分为逻辑结构和物理结构
逻辑结构
逻辑结构是指数据对象中数据元素之间的相互关系。逻辑结构分为四种:
- 集合结构:几何结构中的数据元素除了同属于一个集合外,它们之间没有其他关系。
- 线性结构:线型结构中的数据元素之间是一对一的关系
- 树形结构:树形结构中的数据元素之间存在一种一对多的层次关系
- 图形结构:图形结构元素是多对多的关系
物理结构
物理结构是指数据的逻辑结构在计算机中的存储形式。有两种:顺序存储和链式存储。
- 顺序存储结构:是把数据元素存放在地址连续的存储单元里,其数据间的逻辑关系和物理关系是一致的。 例子:数组
- 链式存储结构:是把数据元素存放在任意的存储单元里,这组存储单元可以是连续的,也可以是不连续的。数据元素的存储关系并不能反映其逻辑关系,因此需要用一个指针存放数据元素的地址,通过地址找到相关联数据元素的位置。
线性表
线性表:零个或多个数据元素的有限序列(有顺序)
每个元素除了第一个和最后一个,都有且仅有一个直接后续元素和直接前驱元素。
线性表有两种物理结构:
1. 顺序存储结构
线性表的顺序存储结构,值得使用一段地址连续的存储单元一次存储线性表的数据元素。 可以随时算出线性表中任意位置的地址,不管是任何位置都是相同的时间。那么我们对每个线性表位置的存入或者取出数据,对于计算机来说都是相等的时间,也就是一个常数,存取时间性能为O(1)。有该特点的存储结构称为随机存取结构。
顺序存储结构的插入删除
插入操作时,后面的元素全部都要顺位多加一位。删除操作则是全部往前移动一位。时间复杂度为On。
线性表顺序存储结构的优缺点
优点:
- 无需为表示表中元素之间的逻辑关系而增加而外的存储空间
- 可以快速地存取表中任意位置元素。 缺点:
- 插入和删除操作需要移动大量元素
- 当线性表长度变化较大时,难以确定存储空间的容量
- 造成存储空间的碎片
2. 链式存储结构
链式存储结构中为了表示每个数据元素与其直接后继数据元素之间的逻辑关系,对于数据元素本身来说,除了存储其本身的信息外,还需存储一个指示其直接后继的信息。把存储数据元素信息的域称为数据域,把存储直接后继位置的域称为指针域。指针域中存储的信息称作指针或链。这两部分信息组成数据元素的存储映像,称为结点。
n个节点链结成一个链表,即为线性表的链式存储结构,因为此链表的每个节点中只包含一个指针域,所以称为单链表。表中的第一个节点的存储位置叫做头指针,头指针是链表的必要元素。为了更方便对列表进行操作,会在单链表的第一个节点前附设一个节点,称为头结点。
头指针与头结点的异同
头指针:
- 头指针是指链表指向第一个节点的指针,若链表有头结点,则是指向头结点的指针。
- 头指针必要的,无论链表是否为空
头结点
- 为了操作的统一和方便而设立的,放在第一元素的节点之前,其数据域一般无意义。
- 有了头结点,对在第一元素节点前插入节点和删除第一节点,其操作与其他节点的操作就统一了。
- 头结点不是链表的必须要素。
单链表的操作
读取
对于单链表读取数据需要根据节点指针一直顺序查找,即时间复杂度为O(n)
删除与插入
- 插入:在a与b元素中插入c,需要先将c的next指向b,然后a的next指向c。这两个顺序不能换。换了链表便断了,也会报错。
- 删除:a,b,c中删除c结点。将a的next直接指向c。相当于a的next指向a的next的next。要先存储b.next,然后a.next指向b.next
时间复杂度如果知道第i个节点指针的位置,时间复杂度就为O(1)。
静态链表
在数组中模拟链表,只是某些高级语言中没有指针创立出来的。
循环链表
单链表中最后的节点next指向头结点。判断结束的条件由next指向null变为next指向头结点。
循环链表
添加了一个前驱指针,插入和删除需要改变两个指针
小结:
若线性表需要频繁查找,很少进行插入和删除操作时,宜采用顺序存储结构。若需要频繁插入和删除,宜采用单链表结构。
栈与队列
栈
栈的定义:栈是限定尽在表尾进行插入和删除操作的线性表
我们把允许插入和删除的一端成为栈顶,另一端成为栈底,不含数据的栈称为空栈。后进后出
队列
队列的定义:队列是指允许在一端进行插入操作,而在另一端进行删除操作的线性表。
队列是一种先进先出的线性表,简称FIFO。允许插入的称为队尾,允许删除的称为队头。