Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >数据结构笔记:线性表走起!(链式存储结构简介)

数据结构笔记:线性表走起!(链式存储结构简介)

作者头像
小Bob来啦
发布于 2020-12-08 07:07:10
发布于 2020-12-08 07:07:10
61500
代码可运行
举报
运行总次数:0
代码可运行

每日一句,送给最珍贵的你:

草在结它的种子 风在摇它的叶子 我们站着,不说话 -《门前》顾城

上次我们学到了线性表的顺序存储结构。

往期推荐:数据结构:线性表走起!(顺序存储结构)

每日推荐:

关于上次讲的顺序存储结构,我们都知道它是有缺点的,最大的缺点便是在插入和删除数据时需要移动大量元素,显然在运行时需要耗费大量的时间。

那怎么解决呢?首先,我们知道顺序存储结构就和有序排队差不多,即它们两个相邻数据之间是存在邻里关系的,在内存中的位置也是挨着的,之间并没有空隙,也就造成了在插入时无法介入,而删除后,又会造成空隙,导致效率低下。

链式存储结构中便会解决上述问题,链式存储结构和顺序存储结构都是各有优点和缺点,谈不上谁比谁好,离开实际环境谈好坏,都是**。关于各种优缺点在后面会给大家介绍到。

线性表链式存储结构定义

书上的定义挺繁琐的,简单来说便是某个元素指向另一个元素,然后另一个元素指向下一个元素,这样每个元素之间自然而然形成了某种关系, 某种链表也就形成啦,如下:

链式存储结构存在以下特点:用一组任意的存储单元存储线性表中的数据元素,这组存储单元可以是连续的,也可以是不连续的,也就是说,这些数据元素可以存在内存未被占用的情况。

链式存储结构和顺序存储结构有很大不同的是一点是数据元素不仅仅只存元素信息,还要存储它的后继元素的存储地址,如下图所示:

这里把存储数据元素的域称为数据域,把存储直接后继元素的域称为指针域。指针域中存储的信息称为指针或链,这两部分信息组成数据元素ai的存储映像,称之为结点当有n个结点时,即组成了线性表的链式存储结构,又因为每个结点中只包含一个指针域,所以叫做单链表。

我们也把链表中第一个结点的存储位置叫做头指针,那么链表的存储也必须是从头指针开始存储的啦,...当指针指向最后一个元素时,那么最后一个数据元素的指针并不会消失,小编好像也没有说会消失哦

我们规定的线性链表的最后一个结点指针为”空“(通常用“NULL”或“^”符号表示)。

在第一个头指针的结点之前我们会另外设置一个结点,称为头结点,在这个头结点的数据域中可以不存储任何信息,哈哈哈,小编也不知为啥它会有这个特权呢?

当然在头结点的数据域也是可以存储信息的,比如线性表的长度等附加信息(一般无意义),头结点的指针域指向第一个结点的指针。

关于小编存在的几点疑问:

  1. 头结点的指针域是头指针吗? :网上说法不一,按照个人逻辑,头指针是指向第一个结点的,那么头结点便是第一个结点,即头指针是指向第一个头结点的数据域。在单链表中可以没有头结点(可有可无,尽量还是写为好),但不能没有头指针。
  2. 头结点可以不写吗? 这里简单介绍头结点的作用:1.防止单链表是空而设,当链表为空时,带头结点的头指针就指向头结点,如果当链表为空时,单链表没有带头结点,那么它的头指针就为NULL。 2.方便单链表的特殊操作,能有效减少代码量,当插入在表头或者删除第一个结点时不用考虑特殊情况,删除或插入用户的第一个节点的值和删除或插入中间的值用一样的代码,这就保持了单链表操作的统一性! 3.单链表加上头结点之后,无论单链表是否为空,头指针始终指向头结点,因此空表和非空表的处理也统一了,方便了单链表的操作,也减少了程序的复杂性和出现bug的机会。 4.总的来说,没有头结点对第一个结点的操作大多和中间结点不太一样,很多操作都要考虑特殊情况,有头结点的话就不必考虑那么多,也不容易出现代码错误。
  3. 头结点的数据域可以存放有效数据嘛? :只能说头结点的数据域并不是不能填写,而是如果填写实际有效数据后那么头结点的意义便荡然无存了...但是还是可以填写如结点数(在实际有效数据中可有可无)等等的数据。

在单链表中,我们可以用C语言的结构指针来描述:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
typedef strcut Node{    //线性表单链表的存储结构
ElemType data;
strcut Node *Next;
}Node;
typedef strcut Node *LinkList;    //定义LinkList

由上面的代码可知,结点由存放数据元素的数据域和存放后继节点指针的指针域组成。

假设p是指向线性表的第i个元素的指针,那么p->data便是结点ai的数据域,p->next便是结点ai的指针域,那么p->next指向谁呢?当然是指向第i+1个元素啦。p->next->data即是结点第a(i+1)的数据域啦!

未完待续...

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-09-27,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员Bob 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
线性表
1、线性表的定义 线性表(List):零个或多个数据元素的有限序列 第一个元素无前驱,最后一个元素无后继,其他元素都有且只有一个前驱和后继。然后,线性表强调是有限的, 线性表元素的个数n(n≥
Dwyane
2018/05/22
6470
【数据结构】线性表的链式存储结构
显然,这样的结构如果碰到数据量庞大并且需要频繁进行头插或中间插入的情况时的操作时间复杂度是极其庞大的.那么如何解决这个问题呢?我们先来思考一下导致这个问题的原因:
修修修也
2024/04/01
2390
【数据结构】线性表的链式存储结构
数据结构学习笔记——线性表(中)
线性表的链式存储结构的特点是用一组任意的存储单元存储线性表的数据元素,这组存储单元可以是连续的,也可以是不连续的。这就意味着,这些数据元素可以存在内存未被占用的任意位置。
蜻蜓队长
2018/08/03
4250
数据结构学习笔记——线性表(中)
线性表简介
学习数据结构 -> 线性表 -> 线性表的介绍     线性表是一种典型的数据结构, 线性结构的基本特点是线性表中的数据元素是有序且有限的, 在线性结构中, 有且仅有一个被称为"开始数据元素"和一个"最后数据元素", 除了开始数据元素没有直接前驱, 最后一个数据元素没有直接后继外, 其余的数据元素有且仅有唯一的一个直接前驱和直接后继。     整理下来说, 线性表具有如下基本特征:         1>. 线性结构中必然存在唯一一个"开始数据元素" ;         2>. 线性结构中必然存
猿人谷
2018/01/17
7060
线性表简介
【数据结构(C语言版)系列一】 线性表
数据是对客观事物的符号表示,在计算机科学中是指所有能输入到计算机中并被计算机程序处理的符号的总称。
闪电gogogo
2018/10/10
2.3K1
【数据结构(C语言版)系列一】 线性表
数据结构:线性表之链式存储结构
为了表示每个数据元素ai与其直接后继元素ai+1之间的逻辑关系,对数据ai,除了存储其自身的信息之外,还需存储一个指示其 直接后继的信息(即直接后继的存储位置)。这两部分信息组成数据元素ai的存储映像
s1mba
2018/01/03
1K0
数据结构:线性表之链式存储结构
数据结构学习笔记——线性表(下)
了解过线性表的链式存储结构以后,有人就想出来用数组来代替指针,来描述单链表。看看他们是怎么做到的。
蜻蜓队长
2018/08/03
2670
数据结构学习笔记——线性表(下)
数据结构学习笔记(线性表)
  1.基础概念:   *数据((数据对象(数据元素(数据项)))------包含关系。    *数据结构是互相之间存在一种或多种特定关系的数据元素的集合。   *逻辑结构:集合机构,线性结构,树形结构,图形结构。   *物理结构:顺序储存结果、链接储存结构。   2.算法效率问题:   *判断一个算法的效率时,函数中的常熟和其他次要项常常可以忽略,而更应该关注主项(最高次项)的阶数。 最高次项的指数大的,函数随着n的增长,结果也会变得增长特别快。   *常数项:不管这个常数是多少,我们都计作O(1)。
希希里之海
2018/05/16
7760
《大话数据结构》线性表代码总结
//线性表存储的结构代码 #include<stdio.h> #include<stdlib.h> #include<time.h> #define MAXSIZE 1000//静态链表部分的 #define MAX_SIZE 20//最大长度 #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 //线性表顺序存储结构 //自定义的类型 以描述返回状态值 typedef int Status;//Status是函数的类型,其值是函数结果的状
半生瓜的blog
2023/05/12
2030
《大话数据结构》线性表代码总结
数据结构——线性表(1)
  今天复习数据结构中最常用和最简单的一种结构,线性表。   线性表,从名字上你就能感觉到,是具有像线一样的性质的表。在广场上,有很多人分散在各处,当中有些是小朋友,可也有很多大人,甚至还有不少宠物,这些小朋友的数据对于整个广场人群来说,不能算是线性表的结构。但像刚才提到的那样,一个班级的小朋友,一个跟着一个排着队,有一个打头,有一个收尾,当中的小朋友每一个都知道他前面一个是谁,他后面一个是谁,这样如同有一根线把他们串联起来了。就可以称之为线性表。
向着百万年薪努力的小赵
2022/12/02
4710
数据结构——线性表(1)
浅谈线性表
还记得我们小学时放学之前要做什么吗--排队。我记得我总是排在第二位置,前面是那个男孩,后面是另外一个男孩,每次都是他们,为什么要这么做?因为当我看不见他们的时候,老师可以迅速找出谁不在,迅速清点人数。这种排好队的组织方式,就是我们即将学习的数据结构:线性表。
哆哆jarvis
2022/08/23
2350
浅谈线性表
数据结构——线性表(2)
上接 数据结构——线性表(1) 上文中介绍了线性表的顺序存储结构和单链表的介绍与代码实现,接下来,继续介绍线性表的链式存储
向着百万年薪努力的小赵
2022/12/02
2860
数据结构——线性表(2)
线性表(Linear List) 原
线性表是我们日常工作中最简单也是最常用的一种数据结构。 它有如下特点: 每个数据元素最多只能有一个直接前趋。 每个数据元素最多只能有一个直接后继。 只有第一个数据元素没有直接前趋。 只有最后一个数据元素没有直接后继。
云飞扬
2019/03/13
7090
线性表(Linear List)
                                                                            原
数据结构—线性表
本篇开始,又会开始一个新的系列,数据结构,数据结构在算法或者是编程中的重要性不言而喻,所以学好数据结构还是很有必要的。本篇主要介绍数据结构的第一个结构——线性表,主要分为以下几部分: 1.概念 2.存储结构
张俊红
2018/07/30
7210
数据结构—线性表
数据结构与算法(二)-线性表之单链表顺序存储和链式存储
前言:前面已经介绍过数据结构和算法的基本概念,下面就开始总结一下数据结构中逻辑结构下的分支——线性结构线性表
2018/09/26
1.4K0
数据结构与算法(二)-线性表之单链表顺序存储和链式存储
算法与数据结构(一) 线性表的顺序存储与链式存储(Swift版)
温故而知新,在接下来的几篇博客中,将会系统的对数据结构的相关内容进行回顾并总结。数据结构乃编程的基础呢,还是要不时拿出来翻一翻回顾一下。当然数据结构相关博客中我们以Swift语言来实现。因为Swift语言是面向对象语言,所以在相关示例实现的时候与之前在大学学数据结构时C语言的实现有些出入,不过数据结构还是要注重思想,至于实现语言是面向对象的还是面向过程的影响不大。 接触过数据结构的小伙伴应该都知道程序 = 数据结构 + 算法。数据结构乃组织组织数据的结构,算法就是对这些结构中的数据进行操作,可见数据结构的重
lizelu
2018/01/11
1.3K0
算法与数据结构(一) 线性表的顺序存储与链式存储(Swift版)
数据结构(三)链式表
线性表分为顺序存储结构和链式存储结构,顺序存储结构已经在上一篇文章中讲过,本文就来介绍链式存储结构。
xbai921031
2022/05/25
3990
数据结构(三)链式表
数据结构--线性表和链表的基础知识
近期准备重新学习一下常用数据结构和基本算法,并计划将这些内容的只是做一个整理和归类,准备慢慢写一个常用数据结构与基本算法的系列博文,博文列表参见:常用数据结构与基本算法博文系列,目前内容还比较少,后续慢慢补充。本文主要内容是介绍 数据结构--线性表和链表的基础知识。
mukekeheart
2020/09/16
9720
数据结构--线性表和链表的基础知识
数据结构:这是一份全面& 详细的 线性表 学习指南
http://blog.csdn.net/chenleixing/article/details/42392283
Carson.Ho
2019/03/08
3110
数据结构:这是一份全面& 详细的 线性表 学习指南
数据结构与算法笔记 cp2-2:线性表
对于每一个元素来说,它需要存储自身信息在数据域中,还需要存储直接后继的位置信息在指针域中,这两部分信息共同构成一个结点(Node)。n 个结点就 链结成一个链表,如果每一个结点只有一个指针域,那么它就是单链表。
Chor
2019/11/07
3530
相关推荐
线性表
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档