数据结构 第二章 线性表 学习笔记

目录

一、线性表的定义和特点

1.1 线性表

1.2 线性表的特点

二、线性表的存储

2.1 顺序存储

2.2 链式存储

1、单链表

2、循环链表

3、双向链表

2.3 两种存储方式的比较

一、线性表的定义和特点

1.1 线性表

数据元素不同但是一定都属于一种数据对象(就是说它们一定是一类的),在C/C++中,稍微复杂的线性表通常用class或struct进行封装,当表中元素为空时,则视为空表。

1.2 线性表的特点

1、存在唯一的一个被称为“第一个”的数据元素;

2、存在唯一的一个被称为“最后一个”的元素;

3、除第一个之外,结构中的每个数据元素均只有一个前继;

4、除最后一个之外,结构中的每个数据元素均只有一个后继。

在第一章绪论中就提到,线性结构是一种一对一的结构,而线性表的四个特点,其实都是在描述这条性质,即只有相邻两个元素才有关系,又称为存在序偶关系

二、线性表的存储

在绪论中提到过,描述一个数据结构通常从存储结构和逻辑结构两方面入手,现在既然已经描述完了线性表的逻辑结构,再来说说它的存储结构。

2.1 顺序存储

即意味着存储需要占用连续的存储空间,那么就意味着我们可以通过知道单个数据数据元素所占用的存储空间来得到,在C/C++中常常通过这个原理,在得到一个数组的首地址后来表示后继的元素。如快速排序中对数组首地址的引用来实现对整个数组的排序。

在数据结构中,常常会出现这种需要计算位置的题

这种题弄懂了存储原理之后就变得非常简单了,要注意的地方在于C/C++的数组由于从0开始计数,所以一定要把0算进去!!!

另外,二维数组的存储其实可以理解为一维数组的分段,如A【m】【n】其实是存储了一个长度为(n+1)*(m+1)的数组,然后以m+1为一段分成n+1段,高维的存储原理类似。

这种存储方式的优势是在知道首地址的情况下对于访问特定位置的元素的时间复杂度为O(1)(用上述做法直接算出访问元素的地址进行访问),缺点是在访问过程中如果进行删除或者插入操作往往需要O(n)的复杂度来移动后继的元素维护线性表的顺序结构。

 \frac{1}{n}\sum_{i=1}^{n}(n-i)=\frac{n-1}{2}

2.2 链式存储

链式存储常由结点间的联结表示,“链”其实就是对其的一种形象化表述,为了记录后继结点,相较于顺序存储,链式存储需要多用到一个工具:指针。

因此,一个结点往往由两个域构成:数据域指针域

一般的,我们才用单链表,循环链表和双向链表用于实现线性表的链式存储,由于这些存储不需要存储位置相邻,我们一般称这种存储结构为非顺序映像链式映像

1、单链表

单链表的每个结点只有一个指针,指向的是后继结点的存储地址。因此,单链表实现的顺序表只能支持正向的查找,而无法从一个结点逆推上一个结点的位置。

在单链表中,只要知道是在哪个位置进行操作,删除和插入都可以在O(1)的时间复杂度内完成(只需要修改操作位置的指针指向)

查询只能从首结点开始搜索,因此,时间复杂度为O(n)

\frac{1}{n}\sum(n-i)=\frac{n-1}{2}​​

最后,区分一下头结点,首元结点​​​​​和头指针的区别:
头结点指的是在首元结点前附加的一个节点(这样更容易完成对首个存储数据元素的删除,插入操作)

首元结点指的是首个存储数据元素的结点

头指针指的是这个线性表的第一个结点(不管它是否装了数据元素)

注意:

1)当设置头结点时判断线性表为空的条件为p->next==NULL,不设置时为p==NULL;

2)由于链表的每个结点存储位置是随机的,所以其属于顺序存取的存取结构,导致操作不同于顺序表;

3)前插法和后插发并无本质区别,主要区别在于插入位置不同,时间复杂度均为O(n)。

2、循环链表

基本与单链表没有区别,但是不需要头结点,特点在于尾结点的下一指针不再是空,而是指向首元结点,这样一定可以在O(n)的时间复杂度里查询到目标,此时,判断链表为空的条件变为p!=NULL或p->next!=L

3、双向链表

每个结点的指针信息从一个变为两个,分别记录了前驱和后继结点的地址,使得链表支持在任意结点双向查找(既可以向前遍历也可以向后遍历),与单链表唯一的区别在于每次插入和删除修改时需要改动两个指针。

2.3 两种存储方式的比较

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值