数据结构笔记(三)

上次分享中,我们分享了算法定义以及算法的时间复杂度和空间复杂度,在本次分享中,将讨论什么是线性表,以及线性表的基本运算。

  • 线性表的逻辑定义

(1) 线性表,Linear_List是最简单和最常用的一种数据结构。
(2) 线性表是由n个数据元素(结点)a1,a2,…,an组成的有限序列。类比数学中的数列概念。其中我们规定数组元素的个数n为该线性表的长度,size。当n为零时,称为空表。
(3) 非空的线性表通常记为:(a1,a2,a3,…,an),其中ai(1<=i<=n)表示线性表的其中一个结点。
(4) a1称为表的开始结点,无直接前继,有一个直接后继a2;
an为表的终端结点,无直接后继,有一个直接前继an-1;
其余元素ai(2<=i<=n-1)为内部元素,有前继ai-1,后继ai+1;
结点与结点之间是线性的关系。故称之为线性表。

总而言之,就是n个具有相同特性的数据元素的有限序列,这n个数据元素之间的关系是一对一的关系。

  • 线性表的基本运算
    (1) 置空表initlist(L),构造一个空的线性表;
    (2) 求表长listLength(L),返回线性表的长度;
    (3) 取元素getNode(L,i),1<=i<=n;
    (4) 按值查找 LocateNode(L,x),返回第一个为X的结点的位置,若表中不存在则返回0
    (5) 插入insert(L,i,x) 在L的i位置插入x,
    (6) 删除delete(L,i) 删除表中的第i个元素
  • 线性表的存储方式
    顺序存储,链式存储
顺序存储
(1) 线性表的顺序存储指的是将线性表的数据元素按其逻次序依次存入一组地址连续的存储单元中,用这种方式存储的线性表称为顺序表,例如数组。
(2) 线性表中第i个元素的存储位置为:LOC(ai)=LOC(a1)+(i-1)*d ,其中ai的地址称为首地址或基地址。
(3) 因为在顺序表中任何一个元素的地址都可以通过计算确定,所以可以做到随机存储。举例内存的读取模式。
线性表的链式存储
- 顺序表的读取快,但是插入与删除缓慢,鉴于此,引申出链表
- 链表不可以随机读取,因为第i个元素的地址不能直接读取到
- 单链表(线性链表) (1) 存储ai时,除了保存ai本身,还存储了ai+1的地址信息,即C中的指针。包含了两部分信息的结点,含有原有数据的域为数据域,存储直接后继的为指针域。
(2) 采取这种存储方式的表为链表,其中每一个结点的存储结构为:[data][next]
(3) 因为每一个结点只包含1个指针域,所以称为单链表。
(4) 因为第一个结点没有直接前趋,所以特地设立一个head存放第一个元素的地址,即头指针。而终端结点的指针域则为null。如果表中一个结点也没有,则head=NULL
单链表的运算
(1) 建立单链表:
① 头插法:从一个空表开始,重复读入数据,生称新结点,将数据存到数据域中,然后将新结点的地址存到表头上。 插入顺序与链表顺序相反。
② 尾插法:将新结点插入到当前链表的表尾,需要一个尾部指针,rear,使其始终指向链表的尾结点。只要新结点插入进去了,那么他就会变成尾部结点。
(2) 查找运算: 因为链表中的地址隐含在前趋中,所以必须从head开始查找
(3) 插入运算:对于链表的不同位置,插入的过程会有细微的差别。中间、末尾的添加过程其实是一样的,关键是在首部添加,会有不同,会改变整个单链表的起始结点。 1.指明新结点的后继 s.setNext(p.getNext()); 或者 s.next = p.next 2.指明新结点的前驱(其实是指明前驱结点的后继是新结点) p.setNext(s) 或者 p.next = s;
(4) 删除运算:删除和插入一样的道理。

在这里插入图片描述
在这里插入图片描述
我们可以看出,头插是天生的栈,尾插是天生的队列,队列和栈将在下节课分享

单循环列表
其实和单链表区别不是很大,单链表最后一个元素next指向null,循环单链表指向第一个元素。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值