线性表

在本文中的顺序存储结构、链式存储结构等都是对线性表而言的

线性表(Linear List):零个或多个数据元素的有限序列,元素的个数定义为线性表的长度,无元素时称为空表;每个元素的位置称为位序(类似下标),某元素的前一个元素称作直接先驱元素,后一个元素称作直接后继元素

顺序存储结构:

用一段地址连续的存储单元依次存储线性表的数据元素,在C中用一维数组来实现(Python中可以用列表来实现),描述该结构需要三个属性:

  • 存储空间的存储位置:数组的存储位置
  • 线性表的最大存储容量:即数组长度(如果不动态分配,这个长度是不变的)
  • 线性表的当前长度;
  1. 地址:存储器中的每个存储单元所独有的编号,若每个a(代表数据元素)所占c个存储单元,LOC为获得存储位置的函数,那么计算方法为:
    • LOC(下标为i+1的a) = LOC(下标为i的a) + c
    • LOC(下标为i的a) = LOC(下标为1的a) + (i-1) * c
  2. 顺序存储结构的操作:
    • 读取:若要取第i个元素,就访问下标为i-1的元素,注意i值的范围(小于表长、不小于1),时间复杂度为O(1)
    • 插入:需注意插入后线性表的长度;从最后一个元素向前遍历到第i个位置,并分别向后移一个位置(即下标+1),插入后表长度+1,时间复杂度插一个为O(n)
    • 删除:与插入操作相反,不再赘述
  3. 线性表顺序存储结构的优劣:
    • 优点:不用为表中元素之间的逻辑关系添加额外的存储空间;可以快速存取表中任一位置元素
    • 缺点:插入和删除操作时间复杂度高;长度变化大时难以确定存储空间容量;造成存储空间的"碎片"

链式存储结构

在链式结构中,除了要存数据元素信息外,还要存储它的后继元素的存储地址,其中存储数据元素信息的域称为数据域,存储直接后继位置的域称为指针域;指针域中存储的信息称作指针。这两部分信息组成数据元素ai(下标为i的a)的存储映像,称为结点(Node)

单链表

n个结点链结成一个链表,即为线性表的链式存储结构,因为此链表的每个结点中只包含一个指针域,所以叫做单链表

  1. 头指针(必须要素):链表中的第一个结点的存储位置,指向第一个结点(最后一个节点的指针为空(NULL或"^"表示))
  2. 头结点(非必须):有时为了方便操作第一结点,会在单链表的第一个结点前附设一个节点,其数据域可以为空
  3. 若p是指向线性表第i个元素的指针,ai的数据域用p->data表示,指针域用p->next表示,那么ai+1的数据域的表示可以用p->next->data
  4. 链式存储结构的操作:
    • 读取:若要取第i个元素,从第一个结点开始遍历链表让指针不断向后移动直至第i个结点随后进行读取(元素存在)或到末尾指针为空(元素不存在)
    • 插入:若要在第i个元素插入数据e,声明指针p指向头结点,遍历链表使p到指定位置(即第i-1个结点)并生成一个空节点s,将e赋值给s->data,使用单链表的插入标准语句:s->next=p->next; p->next=s(将p的后继结点赋值给s的后继;将s赋值给p的后继),插入完成
    • 删除:大体与插入类似;假设在链表中存在结点p, d, q,d是要删除的结点,把p的后继结点改成q即可 (也就是p的后继的后继结点),删除标准语句:q=p->next; p->next=q->next
    • 整表创建:头插法(把新结点插在头结点后)、尾插法(比头插法多需要一个指向尾结点的变量)
    • 整表删除:先声明p和q:第一个结点赋给p;循环:p->next赋给q,释放p,q赋给p;直至p指针为空
  5. 单链表结构(单)与顺序存储结构(顺)优劣:
    • 存储上:顺用是的一段连续的存储单元依次存储;单不受固定的存储空间限制
    • 时间性能:查找:顺为O(1), 单为O(n);插入和删除:顺为O(n), 单(找出位置后)为O(1)
    • 空间性能:顺需要预分配;单可以动态生成
    • 总结:查找多时用顺结构,频繁增改时用单结构;表长可确定用顺结构,表长没准时用单结构

静态链表

不用指针,而是用数组描述的链表;让数组的元素由两个数据域组成,每个下标都对应一个data和cur(称作游标, 相当于next指针),也称作游标实现法

  1. 数组中的首尾元素作为特殊元素处理不存数据,把未使用的数组元素称为备用链表,首元素的cur存放备用链表的第一个结点的下标,尾元素的cur存放第一个有数值的元素的下标,最后一个有值元素的cur为0
  2. 插入操作:先把要插入的数据赋给备用链表元素,再通过把插入位置前的元素的cur指向备用链表元素同时把原指向赋给备用链表元素的cur(需定义类似malloc()的函数来分配备用下标,以实现动态链表的节点申请)
  3. 删除操作:把首元素的cur赋给将目标元素的cur,再把首元素的cur指向目标元素
  4. 静态链表优劣:
    • 优点:插入和删除只需修改游标,免去移动元素的操作
    • 缺点:连续存储分配使表长难以确定;失去顺序存储结构随机存取的特性
    • 总结:静态链表是为了给没有指针的高级语言设计的一种实现单链表的方法,根据实际需要使用

循环链表

将单链表中终端结点的指针端由空指针改为指向头结点,使整个单链表形成一个环,这种头尾相接的单链表称为单链表循环,简称循环链表

  1. 与单链表的主要差异在于循环的判断条件上:若p->next不等于头结点,则循环未结束
  2. 将两个循环链表合并成一个表时用尾指针操作会方便很多

双向链表

在单链表中,查找下一结点需要O(1),若要查找上个结点最坏需要O(n),为解决此问题人们设计出了双向链表:在单链表的每个结点中再设置一个指向其前驱节点的指针域(prior),也就是用空间换时间

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

推荐阅读更多精彩内容

  • 大学的时候不好好学习,老师在讲台上讲课,自己在以为老师看不到的座位看小说,现在用到了老师讲的知识,只能自己看书查资...
    和珏猫阅读 1,433评论 1 3
  • 1.线性表的定义 线性表:零个或多个数据元素的有限序列序列:也就是说元素之间是有顺序的,若元素存在多个,则第一个元...
    e40c669177be阅读 2,024评论 6 15
  • 3.7 单链表的读取 在线性表的顺序存储结构中,我们要计算任意一个元素的存储位置是很容易的。但在单链表中,由于第i...
    努力生活的西鱼阅读 352评论 0 0
  • 在上一篇文章中我们简单说了数据结构的概念和数据结构与算法的一些关系,这一篇文章的内容是关于线性表的东西,主要有线性...
    硅谷小虾米阅读 1,257评论 1 3
  • 前言 什么是线性表?线性表的两大存储结构是什么?各种存储结构是如何实现存取、插入删除等操作的?本篇主要解答了这几个...
    JonyFang阅读 1,540评论 4 17