数据结构学习笔记(五)——线性表的顺序存储与链式存储

近几次总是讨论着各种各样的表,难免有些晕。
这次的内容依然是一个表(笑哭脸),为了不“晕表”,我们先来理一理:这是个什么表。

我们前面已经说过线性表了。对于线性和非线性的逻辑结构,都对应有顺序存储和链式存储两种方式。

先说顺序表,也就是线性表的顺序存储。

顺序表

大家都学过C语言,那么顺序表好理解一些的方式就是用C语言的数组作为例子来说。
(我好像确实比较喜欢用例子来类比。。。见谅)

C语言的数组实际上就是线性表的完全表现载体
我们先来回顾一下数组的种种:

  • 数组有一个首地址;
  • 只要知道数组的首地址,那么我们可以随意访问数组中的元素;
  • 数组的存储(在内存中)是连续的;

顺序表的性质和以上三个大致相同。

但是依然需要区别数组和顺序表:顺序表依然是一种存储模型,但是数组是实实在在的存储容器。我们可以对顺序表执行一系列的运算(这时候把顺序表作为对象来看待),但是对于数组我们依然只能对其进行一些基础操作。

比如说,一个顺序表是用数组去表达的(即在数组中存放顺序表元素,一般数组要足够大),这时候顺序表的长度和数组的长度是不完全一致的。数组的长度指的是数组所占的空间数,而顺序表的长度仅仅是指有效数据所占的空间。

其实我们可以简单总结一下:顺序表=数组+各种针对数组的运算的函数

关于顺序表的运算的函数这里不再赘述,相对来说比较基础,有C语言学习经历的小伙伴们可以很容易自己去实现。

链式线性表

说完了顺序表,接下来说链式存储的线性表。
基于前面的顺序表的概念,链式线性表是存储上不连续的线性表——对应到C语言中就是用链表来表达线性表。

有C语言基础的小伙伴一定都很熟悉单链表的基础操作了,这里不再赘述。
因为链表是用指针实现线性表的前驱与后继,所以更适合利用指针的操作来使得线性表的修改操作变得更容易一些。故,一些需要改动内容的线性表更适合用链式线性表来表达。

但是有时候用之前学过的单链表来表达线性表依旧是不方便、不形象的。所以还有几种不同于之前单链表的几种链表:

1.循环链表:
所谓的循环链表就是之前的单链表的一个“变形”。原来的单链表的尾指针是指向NULL的,这时候只要把该单链表的尾指针指向该单链表的头结点,即可构成循环链表。此时尾结点成为了首节点的前驱。且因为循环链表的操作一般是对原先的单链表的首尾节点进行操作,为了减少从头开始遍历到尾结点的时间,所以习惯性用尾指针来指示链表。当然这也不是绝对的,具体情况具体对待。

2.双向链表:
在使用之前学过的单链表或者循环链表时会发现,无论如何我们只能从某个节点开始定向遍历,所以当我们需要找到该节点的前驱的时候就需要从头开始重新遍历单链表或者循环遍历一遍链表,在时间开销上来说十分不划算。所以这时候用双向链表就会好一些。
双向链表就是在之前单链表的节点基础上,对节点的结构再添加一个指针,该指针指向该节点的前驱节点。这时候每个节点都可以直接访问该节点的前驱和后缀,就能大大减少时间的开销。
同时要注意的一点是,在双向链表的操作中,修改链表(增、删等)都需要同时操作前驱节点的指针和后继结点的指针,并且需要使当前节点的两个指针的指向都正确。

3.静态链表:
在这之前我们说到的都是动态链表,因为节点都是在用的时候申请、不用时销毁的。但是静态链表就有些特殊了。
静态链表是用数组实现的。
先不要慌。静态链表之所以依然取名为链表,就是因为它还是具有链表的特点:以节点为单位、相邻元素间的逻辑由指针的指向来确定。
但是为什么叫静态链表并且强调它是用数组来实现的呢?
想象一下,把一条贪吃蛇揉吧揉吧塞到一个盒子里,蛇宝宝的头可能和尾巴都是相邻存放的,但是逻辑结构依然是蛇的身子表达出来的。静态链表就是这样,将一个链表“存到“数组中,兼顾了链表和数组的特点:链式逻辑,数组存储。下面盗一张图来说明一下:

图片.jpg
图片.jpg

可以看出,本来应该是指针的,现在是用一个数(作为数组的下标)来指示下一个节点的位置。这时候next已经不是指针了,而被称为游标,游标就是用来模拟链表中的指针的。
一般来说,都是用大数组去作为静态链表的存储空间,然后去执行单链表的(增、删、改、查)一系列操作。好处是不用遍历链表到指定的位置即可操作元素,只要改动next的值就可以实现。

顺序表和链式线性表的比较

上面说完了顺序、;链式两种方式以及各自的载体去实现线性表的表达。下面分析一下二者各自的优缺点:

对于顺序表而言,就是一系列的数组特性:存取数据操作简单、存储密度高、连续读取的效率高。但是执行插入、删除等操作时,会有大量数据被连同操作,资源开销大;而且总占用空间有一个固定的大小,容易产生资源闲置或溢出的现象。

对于链式存储来说则是链表的特性:存储密度较小(因为节点中往往需要分配指针域,而且数据在内存中的存储并不是连续的地址,连续读取的过程中需要不断进行指针运算)。但是执行插入、删除等操作时十分方便,不用操作其他无关数据。

总结起来说就是:如果线性表不需要执行插入、删除等改动元素的操作的话用顺序表比较合适,否则则采用链式线性表。
还有就是,几乎所有的编程语言都支持数组,但不一定支持指针。
这就意味着,顺序表无论如何是可以实现的,但是链式线性表就不一定能实现了!

以上就是线性表的两种存储形式的表达的讨论和总结。


说点题外话:
为什么要把这个并不复杂的东西的概念说这么多呢?
私以为,概念神马的还是蛮重要的,从根本出发弄清楚概念,对后面的应用或者更复杂的操作会有比较大的帮助。另外一方面,很多东西我们会用,但不知道为什么这么用。作为计算机专业的学生,在专业知识方面,我还是想达到“知其然,知其所以然”的程度。


新手上路,才疏学浅。如有错漏,恳请指教。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,491评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,856评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,745评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,196评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,073评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,112评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,531评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,215评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,485评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,578评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,356评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,215评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,583评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,898评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,497评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,697评论 2 335

推荐阅读更多精彩内容

  • 本文内容取自于小甲鱼的数据结构与算法。http://www.jianshu.com/p/230e6fde9c75 ...
    阿阿阿阿毛阅读 2,844评论 0 7
  • 1.线性表的定义 线性表:零个或多个数据元素的有限序列序列:也就是说元素之间是有顺序的,若元素存在多个,则第一个元...
    e40c669177be阅读 2,014评论 6 15
  • 定义线性表(List):零个或多个数据元素的有限序列 数学定义若将线性表记为(a1, …, ai-1, ai, a...
    梁炜东阅读 626评论 0 0
  • 从数据的逻辑结构来分,数据元素之间存在的关联关系被称为数据的逻辑结构。归纳起来,应用程序中的数据大致哟如下四种基本...
    Jack921阅读 893评论 0 2
  • 在上一篇文章中我们简单说了数据结构的概念和数据结构与算法的一些关系,这一篇文章的内容是关于线性表的东西,主要有线性...
    硅谷小虾米阅读 1,251评论 1 3