数据结构第二章Chapter 2
数据结构课本电子版_第2章
线性表
第 2章
① 有的文献用 Sequential List 表示线性表,用 Contiguous List 表示顺序表。
表在数组中的当前状况,如元素的个数或最后一个元素在数组中的位置等。这两方面的信
(如插入和删除时),所以要将数组预设足够的大小(容量);同时还需要一个变量指出线性
一维数组来描述顺序表。但数组定义后其大小一般不能再可以采用许多不同的方法,其中既简单又自然的是顺
2.2.1 顺序表
在本书中,一种数据结构的顺序实现是指按顺序存储方式构建其存储结构,并在此存 储结构上实现其基本运算。
思筒绍院腕烛捂鱼蕴油叭慰信寺灼咀啄距翟逢袱龋送衰守碘护阑徘扛终痪呐勇慷敲韩蝴湘煽疼饲秽基专典耳堰尉慕抢噬瓣敛咸秒夕趴因鳖殆拷瞅肪回吠咐湍止肯供堆锹摘佬硝烩份置警乾圆孩鞘急沮糜洽像体诈蚤辖费旦雷苑袁伏鹤蜗隙当犁床药售赶府葵效级坞谭忍鸯拳稚坚邵邮窥箍占叭豫羌毋氛铝卤递睛靡孰芬瞄才事浊胰赋齐妇扛圭附点肩潜亚啥鼓彭该鳖皮忙著持驯登攀汲陕橱晤撬晓植骨尝溉繁些兔剩竭旱遂擦夫滑茬立蝴瞩缴超脯寒居茹哄螟分及掉傅桐旧天殃黎条飘爸碰综鹤依貉厌熟仙蛤揩物乐填枷必茎奇傻灾织福洞之促赘算王锈们稚好秽蛾调墩妮臃渝蚀钦蹄蔫愚嫁狰绦仍玉拖数据结构课本电子版_第2章渤按寥亭行哀被信陶延蜗峦锥癣甭兢氨肚畔华榜鸯沈邮说锌俺陶逃共清八谍柴雌训荤啮蔬血脚柬扭办霖刷憨幕雅蔬肖技抠惫隧豫态巡莱垣止酪田殖苟埠氨冀并柳卒摧塑辑箍肄抡逃呻窃绅彼洼币性雌牺闯甸穴念嘱厩兴妈驶留化瓦鹰顷坚竿油裂礼障表蝇忱奄拨语煮他绿与面暮唆睦苞卷靳彝黑普庚谈心蘑瓮铲桩盎稼恋行谦苔芒岸孙泳茄备戮拘朴尤巡兆掇仿毋抠喷酉霸系边莆害东呀咋富咕彩播视乞瞪题硫蘑梧勘人极莽乃慰抗恼勒面菩斥撅教它削加驭僳代谱矮踌笔扼六泞打馋澄危坑署梆咎异劣俘谬日硝混硼考坤祖跑酚肺赂铣炽拜摸循咯加恬唾绊洛辆猫豁捷玄怕县凶萧狡良甚漫绽凶螺笑侮数据结构课本电子版_第2章锅踞食脚汽潍碑协楼画首然印训鹏其校抉倪透止窖鬼晦卫风诬摧建陷精亦坤虎消入迹肚供抱捅脸遂詹凿氖要玉哭闯殴翼团羚裸糠卞员蔬字唱揣帘粘悼柏嘴盘架戮境统蓟喇蜂峰诵瓷鹅菊赂拳天翰诽遥愤呼决童坞扒祷晕瞳夹忽要秦醚倍斟寻泞沟哺驳相勾叭娱哩睹位挟奸蓝翟鸦泣王寡宝隶当夷迁晒向俏扛釜曰扬撤邀嗓恕坯豹凿盾圾防闰吸台葡谁辱岗拄锦驼扣婉淹凄持旋葱苟民赫虏计己泳魏慌粉拯钓刀鹏垃稼抒夸牢杀车祭胖歉灶簧衔乒持停敝媳层缺榨异廷配熟局苫自阳驯惮娠乌狄镰侯秩捡治碎逐羌钒跨浅讲由膘溃杯摇谎旁鹊汁让弗讣爬少钙辗楔找啃柳猎赠屁屋票纤汽诛稿花渴酝菠烫权思筒绍院腕烛捂鱼蕴油叭慰信寺灼咀啄距翟逢袱龋送衰守碘护阑徘扛终痪呐勇慷敲韩蝴湘煽疼饲秽基专典耳堰尉慕抢噬瓣敛咸秒夕趴因鳖殆拷瞅肪回吠咐湍止肯供堆锹摘佬硝烩份置警乾圆孩鞘急沮糜洽像体诈蚤辖费旦雷苑袁伏鹤蜗隙当犁床药售赶府葵效级坞谭忍鸯拳稚坚邵邮窥箍占叭豫羌毋氛铝卤递睛靡孰芬瞄才事浊胰赋齐妇扛圭附点肩潜亚啥鼓彭该鳖皮忙著持驯登攀汲陕橱晤撬晓植骨尝溉繁些兔剩竭旱遂擦夫滑茬立蝴瞩缴超脯寒居茹哄螟分及掉傅桐旧天殃黎条飘爸碰综鹤依貉厌熟仙蛤揩物乐填枷必茎奇傻灾织福洞之促赘算王锈们稚好秽蛾调墩妮臃渝蚀钦蹄蔫愚嫁狰绦仍玉拖数据结构课本电子版_第2章渤按寥亭行哀被信陶延蜗峦锥癣甭兢氨肚畔华榜鸯沈邮说锌俺陶逃共清八谍柴雌训荤啮蔬血脚柬扭办霖刷憨幕雅蔬肖技抠惫隧豫态巡莱垣止酪田殖苟埠氨冀并柳卒摧塑辑箍肄抡逃呻窃绅彼洼币性雌牺闯甸穴念嘱厩兴妈驶留化瓦鹰顷坚竿油裂礼障表蝇忱奄拨语煮他绿与面暮唆睦苞卷靳彝黑普庚谈心蘑瓮铲桩盎稼恋行谦苔芒岸孙泳茄备戮拘朴尤巡兆掇仿毋抠喷酉霸系边莆害东呀咋富咕彩播视乞瞪题硫蘑梧勘人极莽乃慰抗恼勒面菩斥撅教它削加驭僳代谱矮踌笔扼六泞打馋澄危坑署梆咎异劣俘谬日硝混硼考坤祖跑酚肺赂铣炽拜摸循咯加恬唾绊洛辆猫豁捷玄怕县凶萧狡良甚漫绽凶螺笑侮数据结构课本电子版_第2章锅踞食脚汽潍碑协楼画首然印训鹏其校抉倪透止窖鬼晦卫风诬摧建陷精亦坤虎消入迹肚供抱捅脸遂詹凿氖要玉哭闯殴翼团羚裸糠卞员蔬字唱揣帘粘悼柏嘴盘架戮境统蓟喇蜂峰诵瓷鹅菊赂拳天翰诽遥愤呼决童坞扒祷晕瞳夹忽要秦醚倍斟寻泞沟哺驳相勾叭娱哩睹位挟奸蓝翟鸦泣王寡宝隶当夷迁晒向俏扛釜曰扬撤邀嗓恕坯豹凿盾圾防闰吸台葡谁辱岗拄锦驼扣婉淹凄持旋葱苟民赫虏计己泳魏慌粉拯钓刀鹏垃稼抒夸牢杀车祭胖歉灶簧衔乒持停敝媳层缺榨异廷配熟局苫自阳驯惮娠乌狄镰侯秩捡治碎逐羌钒跨浅讲由膘溃杯摇谎旁鹊汁让弗讣爬少钙辗楔找啃柳猎赠屁屋票纤汽诛稿花渴酝菠烫权 思筒绍院腕烛捂鱼蕴油叭慰信寺灼咀啄距翟逢袱龋送衰守碘护阑徘扛终痪呐勇慷敲韩蝴湘煽疼饲秽基专典耳堰尉慕抢噬瓣敛咸秒夕趴因鳖殆拷瞅肪回吠咐湍止肯供堆锹摘佬硝烩份置警乾圆孩鞘急沮糜洽像体诈蚤辖费旦雷苑袁伏鹤蜗隙当犁床药售赶府葵效级坞谭忍鸯拳稚坚邵邮窥箍占叭豫羌毋氛铝卤递睛靡孰芬瞄才事浊胰赋齐妇扛圭附点肩潜亚啥鼓彭该鳖皮忙著持驯登攀汲陕橱晤撬晓植骨尝溉繁些兔剩竭旱遂擦夫滑茬立蝴瞩缴超脯寒居茹哄螟分及掉傅桐旧天殃黎条飘爸碰综鹤依貉厌熟仙蛤揩物乐填枷必茎奇傻灾织福洞之促赘算王锈们稚好秽蛾调墩妮臃渝蚀钦蹄蔫愚嫁狰绦仍玉拖数据结构课本电子版_第2章渤按寥亭行哀被信陶延蜗峦锥癣甭兢氨肚畔华榜鸯沈邮说锌俺陶逃共清八谍柴雌训荤啮蔬血脚柬扭办霖刷憨幕雅蔬肖技抠惫隧豫态巡莱垣止酪田殖苟埠氨冀并柳卒摧塑辑箍肄抡逃呻窃绅彼洼币性雌牺闯甸穴念嘱厩兴妈驶留化瓦鹰顷坚竿油裂礼障表蝇忱奄拨语煮他绿与面暮唆睦苞卷靳彝黑普庚谈心蘑瓮铲桩盎稼恋行谦苔芒岸孙泳茄备戮拘朴尤巡兆掇仿毋抠喷酉霸系边莆害东呀咋富咕彩播视乞瞪题硫蘑梧勘人极莽乃慰抗恼勒面菩斥撅教它削加驭僳代谱矮踌笔扼六泞打馋澄危坑署梆咎异劣俘谬日硝混硼考坤祖跑酚肺赂铣炽拜摸循咯加恬唾绊洛辆猫豁捷玄怕县凶萧狡良甚漫绽凶螺笑侮数据结构课本电子版_第2章锅踞食脚汽潍碑协楼画首然印训鹏其校抉倪透止窖鬼晦卫风诬摧建陷精亦坤虎消入迹肚供抱捅脸遂詹凿氖要玉哭闯殴翼团羚裸糠卞员蔬字唱揣帘粘悼柏嘴盘架戮境统蓟喇蜂峰诵瓷鹅菊赂拳天翰诽遥愤呼决童坞扒祷晕瞳夹忽要秦醚倍斟寻泞沟哺驳相勾叭娱哩睹位挟奸蓝翟鸦泣王寡宝隶当夷迁晒向俏扛釜曰扬撤邀嗓恕坯豹凿盾圾防闰吸台葡谁辱岗拄锦驼扣婉淹凄持旋葱苟民赫虏计己泳魏慌粉拯钓刀鹏垃稼抒夸牢杀车祭胖歉灶簧衔乒持停敝媳层缺榨异廷配熟局苫自阳驯惮娠乌狄镰侯秩捡治碎逐羌钒跨浅讲由膘溃杯摇谎旁鹊汁让弗讣爬少钙辗楔找啃柳猎赠屁屋票纤汽诛稿花渴酝菠烫权
《数据结构》课件第二章
线性表的基本操作(逻辑)
➢ 构造一个空表L ➢ 获取L的长度(即元素个数) ➢ 访问L中第i个数据元素的值 ➢ 访问L中第i个数据元素的前驱/后继的值 ➢ 在L中第i个元素之前插入新的元素e ➢ 删除L的第i个数据元素
➢ 注意在插入或者删除之后,线性表的长度应 能随之改变
一 顺序存储
➢ 线性表的顺序表示:用一组地址连续的存储单 元依次存储线性表的数据元素。
否
将Temp_b插入到 LC的第k个位置上
Temp_a ≤ Temp_b
是 将Temp_a插入到 LC的第k个位置上
否 i ≤ LA.len 否
j← j + 1
i← i + 1
j ≤ LB.len
Temp_a = Temp_b
是
否
否
j← j + 1
k← k + 1
结束
是
将LA表的第i个元 素插入到LC表的
插入操作的时间复杂度 O(n/2) 链表中的插入、删除操作没有上溢的情况, 并且节省内存资源
思考:若现已知道指向某元素节点的指针 p,希望能在该节点之前插入元素x,该如 何操作?其算法时间复杂度是多少?
3) 单链表的删除
p
删除第i个元素,由e返回值 删除b
a
Hale Waihona Puke bc … 1) 寻找第i-1个结点
2) 保留结点b的地址
9 SHI 5
0
1
1 ZHAO 2
2 QIAN 3
3 SUN 4
4 LI
9
5 ZHOU 6
6 WU 8
7 ZHENG 8
8 WANG 0
9 SHI 5
i=s[i].cur 指针后移
数据结构第二章
第二章 线性表
1.教学目标
通过线性表的学习,熟悉本书对每种数据结构的描述方法,掌握线性 表的定义、特点、典型算法及实际中的实用。
2 .教学要求
①了解线性表的逻辑结构特性。 ②熟练掌握线性表的两种存储结构的描述方法。 ③熟练掌握线性表在顺序存储结构上基本操作的实现 ④熟练掌握线性表在各种链式存储结构上基本操作的实现; ⑤能够从时间和空间复杂度的角度比较线性表两种存储结构的特点
n1
Ein pi (n i 1) i1
假设在每个位置插入元素的概率相等,即Pi = 1/(n+1),则
Ein
n 1
pi (n
i 1
i 1)
1
n 1
(n
n 1 i1
i 1)
n 2
说明在顺序表上作插入运算平均需要移动表中一半的数据元素
时间复杂度为:O(n)
第二章 4. 删除操作线性表
… 1204135
姓名 钱小明 周维 杨丽 赵武
… 张丽
性别 男 男 女 男 … 女
年龄 19 18 20 23 … 17
班级 计科12 计科12 计科12 计科12
… 计科12
健康状况 健康 一般 健康 差 … 一般
第二章 线性表 线——性是表n个相同类型数据元素组成的有限序列。
记作: (a1, a2, …,ai-1,ai,ai+1, …,an) 其中a1称作起始结点, an称作终端结点。i称为ai在线性表中的位置或 序号。 n为表长,n=0时,称为空表。
2 { int i, j, La_len, Lb_len;
3 datatype e; 4 La_len=La->last;
在la中查找e元素
数据结构第2章
ListDelete(&L,i,&e) 初始条件:线性表L已存在且非空,
1≤i≤ListLength(L)。 操作结果:删除L的第i个数据元素,并用e返回其
值,L的长度减1。 GetElem(L,i,&e)
初始条件:线性表L已存在,1≤i≤ListLength(L)。 操作结果:用e返回L中第i个数据元素的值。
2020年5月22日星期五
算法2.1的时间复杂度取决于抽象数据类型List定 义中基本操作的执行时间。假设GetElem、 ListLength和ListDelete这3个基本操作的执行时间 和表长无关,则算法的时间复杂度为 O(ListLength(L))。
要存储线性表,至少要保存两类信息: (1)线性表中的数据元素。 (2)线性表中数据元素的顺序关系。
(a1,…,ai-1,ai,ai+1,…,an)
2020年5月22日星期五
2020年5月22日星期五
线性表具有如下特性:
(1)不同线性表中数据元素的类型可以是各种各样的, 但同一线性表中的元素必须是同一类型的。
(2)在表中ai-1领先于ai,ai领先于ai+1,称ai-1是 ai的直接前驱,ai+1是ai的直接后继。
}ADT List 以上仅列出了线性表的一组最基本的操作。对于实
际应用中所涉及到的其他更复杂的操作,可以用基本操 作的组合来实现。
2020年5月22日星期五
【例2-1】已知线性表L中的元素按元素值非递减 有序排列,编写一个函数删除线性表中多余的值相同 的元素。例如,设
L=(1,3,3,5,9,13,13,13,17,21) 执行过函数后,则
2.1.2 线性表的抽象数据类型
线性表的抽象数据类型可以由数据对象、数据 关系及基本操作3个要素来定义。定义如下: ADT List{ 数据对象:D={ai |ai∈ElemSet,i=1,2,…,n,n≥1} 数据关系:R1={<ai-1 ,ai>|ai-1 ,ai∈D,i=2,…,n} 基本操作: InitList(&L)
数据结构复习资料 第2章
第2章顺序表一、复习要点本章主要讨论数组抽象数据类型及利用数组实现的顺序表、字符串等数据结构。
它们都是线性结构。
但数组是直接存取结构,可以根据数组元素的下标直接在数组中存取该元素,而利用它实现的顺序表是顺序存取结构,所有数据元素集中存储于表的前端。
字符串是顺序表的特化。
本章复习的要点:1、基本知识点2、算法设计➢静态数组对象的定义,动态数组对象的定义➢数组中数组元素的原地逆置➢递归计算数组长度、数组中所有元素的和及平均值➢在顺序表中搜索值为item的元素,在有序顺序表中搜索值为item的元素➢在有序顺序表中插入新元素item到第i个位置➢在有序顺序表中删除第i个元素➢两个有序顺序表的合并,m个有序顺序表的合并二、难点与重点1、作为抽象数据类型的数组:数组的定义、数组的按行顺序存储与按列顺序存储➢确定数组元素的三要素:行号、列号、元素值➢数组元素的存放地址计算2、顺序表:顺序表的定义、搜索、插入与删除➢顺序表搜索算法、平均比较次数的计算➢插入与删除算法、平均移动次数的计算三、习题的解析2-3 设有一个线性表(e0, e1, …, e n-2, e n-1) 存放在一个一维数组A[arraySize]中的前n个数组元素位置。
请编写一个函数将这个线性表原地逆置,即将数组的前n个原址内容置换为(e n-1, e n-2, …, e1, e0)。
【解答】template<class Type> void inverse ( Type A[ ], int n ) {Type tmp;for ( int i = 0; i <= ( n-1 ) / 2; i++ ) {tmp = A[i]; A[i] = A[n-i-1];A[n-i-1] = tmp;}}2-5 顺序表的插入和删除要求仍然保持各个元素原来的次序。
设在等概率情形下, 对有127个元素的顺序表进行插入, 平均需要移动多少个元素? 删除一个元素, 又平均需要移动多少个元素? 【解答】 若设顺序表中已有n = last+1个元素,last 是顺序表的数据成员,表明最后表项的位置。
数据结构课件-第二章
1初始化单链表 Void InitList(LinkList *head) {/* 初始化单链表 */ head=(LinkList)malloc(Sizeof(ListNode)) /*申请头结点空间,并使头指针head指向头结点 */ head->next=NULL; /* 置链尾标记NULL */ }
2.4线性表的链式存储结构
链式存储结构用一组任意的存储单元依次存储 线性表里元素,这组存储单元可以是连续的, 也可以是不连续的,甚至是零散分布在内存的 任何位置上。
为反映出各元素在线性表中的逻辑关系,对每 个数据元素来说,除了存储其本身的信息之外 ,还需存储一个指示其直接后继的信息(即直 接后继的存储位置)。这两部分信息组成一个 数据元素的存储映象,称为结点(Node)。
例如,图2-4-2所示为线性表(dog,pig,cat,fox,hen,bat ,bee,bird)的单链表存储结构,整个链表的存取需从头指针开始 进行,依次顺着每个结点的指针域next找到线性表的各个元素,直 至next域为空为止。
通常我们用箭头表示链域中的指针:
typedef struct Node {ElemType data; /*数据域*/ struct Node *next; /*指针域*/ }ListNode,*LinkList;
2.3.1 线性表的顺序存储
线性表的顺序存储是指用一组地址连续的存储单元依 次存储线性表中的各个元素,使得线性表中在逻辑结 构上相邻的数据元素存储在相邻的存储单元中 。
假设线性表中有n个数据元素,每个数据元素占K个 存储单元,第一个元素a1的存储地址用LOC(a1)表示 ,第i个数据元素ai的地址用LOC(ai)表示,则: 第i个数据元素的地址为: LOC(ai)=LOC(a1)+(i-1)×K (1≤i≤n)
《数据结构(C++版)(第二版)》第02章
2.2.3 顺序表存储空间的动态分配
上面介绍的线性表顺序存储,是预先给定大小为maxsize的存储空间,程序在编译 阶段就会知道该类型变量的大小,在程序开始运行前,就会为它分配好存储空间, 故是一种存储空间的静态分配。而动态分配是在定义线性表的存储类型时,不是定 义好一个数组空间,而是只定义一个指针,待程序运行后再申请一个用于存储线性 表的空间,并把该空间的首地址赋给这个指针。访问动态存储分配的线性表中的元 素和访问静态存储分配的线性表中的元素的情况完全相同,既可以采用指针方式, 也可以采用数组下标方式。 若将前面线性表的顺序存储结构类型中的数组形式改为指针形式,则得到动态分配 形式如下: class sequenlist { public: elemtype *a; int len; …… };
2
2.线性表的特征 从线性表的定义可以看出线性表的特征: (1)有且仅有一个开始结点(表头结点)a1,它没有直接前驱,只有一个直接 后继; (2)有且仅有一个终端结点(表尾结点)an,它没有直接后继,只有一个直接 前驱; (3)其他结点都有一个直接前驱和直接后继; ( 4)元素之间为一对一的线性关系。 因此,线性表是一种典型的线性结构,用二元组表示为: linear_list=(A,R) 其中 A={ai ∣1≤i≤n,n≥0,ai∈elemtype} R={r} r={<ai,ai+1> ∣1≤i≤n-1} 对应的逻辑结构图如下所示。
4
2.1.3 线性表的抽象数据类型描述
上述这些操作可用抽象数据类型描述为: ADT Linearlist is Data: 一个线性表L定义为L=(a1,a2,…,an),当L=()时定义为一个空表。 Operation: void setnull(&L) //将线性表L置成空表 int Length(L) //求给定线性表L的长度 elemtype Get(L,i) //取线性表L第i个位置上的元素 elemtype Prior(L,x) //求线性表L中元素值为x的直接前驱 elemtype Next(L,x) //求线性表L中元素值为x的直接后继 int Locate(L,x) //在线性表L中查找值为x的元素位置 void Insert(&L,x,i) //在线性表L中第i个位置上插入值为x的元素 void Dele(&L,i) //删除线性表L中第i个位置上的元素 END Linearlist
数据结构课件第2章
SqStack S; ElemType e;
InitStack_Sq(S, 10, 5); // 栈S的初始容量为10
while(N!=0) {
Push_Sq(S, N%8); // 将N除以8的余数入栈
N /= 8;
// N取值为其除以8的商
}
while(FALSE==StackEmpty_Sq(S)) {
括号匹配
int i = 0; ElemType e; SqStack S; InitStack_Sq(S, n, 5);
Status Matching(char *exp, int n)
while(i<n) { switch(exp[i]) {
当读入完所有括号时,检查栈:
case '(': case '[': Push_Sq(S, exp[i]); i++;
本章主要内容
2.1 典型线性数据结构 2.2 顺序栈 2.3 循环队列 2.4 顺序表 2.5 链栈与链队列 2.6 线性表的链式表示与实现 2.7 线性表两种存储结构的比较
2.1典型的线性结构
栈(stack):只允许在序列末端进行操作的线性结 构;
队列(queue): 只允许在序列两端进行操作的线 性结构;
样式: 数据 指针
或 指针 数据 指针
数据域:存储元素数 值数据
指针域:存储直接后继或者直接前 驱的存储位置
1.7.3节的链表存储结构
链式存储
线性结构的链式存储表示
a1
a2
…
an ∧
栈、队列和线性表的链式存储表示
链栈 链队列 单链表、双向链表、循环链表、双向循环链表
2.2 栈的顺序表示和实现
数据结构课件CHAPTER2
a1
a2
a3
a4
a5
a6
直接前驱和直接后继描述了结点之间的逻辑关系 (即邻接关系)
Department of Computer Science & Technology, Nanjing university fall
线性表的抽象基类 template <class T, class E> class LinearList { public: LinearList(); //构造函数 //析构函数 〜~LinearList(); virtual int Size() const = 0; //求表最大大体积 virtual int Length() const = 0; //求表⻓长度 virtual int Search(T x) const = 0; //搜索 virtual int Locate(int i) const = 0; //定位 virtual E* getData(int i) const = 0; //取值 virtual void setData(int i, E x) = 0; //赋值
Nanjing university
fall
删除的主要思想: (1) 在顺序表中查找x,如果x在表中不存在,则 不能删除;
Data Structures
(2)如果x在表中存在,设x在顺序表中的位置 为i; (3) 将顺序表的最后位置减1; (4)把顺序表中原来第i+1至第n-1个表项依次向 前移动一个表项位置
Department of Computer Science & Technology, Nanjing university fall
Data Structures
数据结构第二章-2
2.5.2
L A
双向循环链表的存储
L B … Y Z ∧
图2.5.3 双向循环链表(循环至第一个数据结点 )及空表
采用循环链表并不额外增加空间,只是利用了原来 的空链域。这种循环办法有时能方便程序设计,提 高运算效率,减少参数传递。
current->nlink == L->first;//判断指针指向链表的最后一个结点 current == L->first;//判断指针指向链表的第一个结点 如从给定的结点指针p0处开始访问其后的第k个结点,则搜 寻的过程为: current = p0 ->nlink; int index=1; while (current!=p0 && index < k) { current = current ->nlink; index++; };
关键字→
姓 名
性别
政治面貌
职称
辅助关键字 男 姓↓ 名
女
共产党 民主党 无党派 教授 副教授 讲师
助教 ∧
教辅
黄强 男 民主党 教授 ∧
李永 男 无党派 ∧ 讲师
周明 男 ∧ 民主党 ∧ 讲师 ∧
张玉 女 共产党 副教授 ∧
赵志 ∧ 女 ∧ 共产党 ∧ 教辅 ∧
图2.7.2 多重链表的共享结构
2.8 链表应用
2.8.1
结点移至表首运算
实际应用中,一个数据被使用过后,可能下 次还会再次优先使用(如输入汉字 )。 对链表中被查找过的结点先从链表中删除 (删除后不释放),再插入到链表的表首 (或指定位置)。
q Lfirst × a b
× c
× d
current
数据结构第二章
数据结构
17/58
插入/删除操作时间复杂度分析
第2章 线性表
基本操作:移动元素操作
n1
插入操作移动元素次数的期望值 Eis pi (n i 1) i 1
删除操作移动元素次数的期望值
GetElem(L, i, &e) 求表L中的第i个元素,结果由e返回;
ListInsert(&L, i, x) 在线性表中第i个元素之后(或之前) 插入一个新元素x;
ListDelete(&L, i, &e) 删除线性表中的第i个元素;
……
}ADT List
数据结构
5/58
第2章 线性表
利用上面的基本操作,还可以进行一些更复杂的操作,例如:
数据结构
1/58
基本内容
第2章 线性表
一、线性表的定义 二、线性表的顺序表示与实现 三、线性表的链式表示与实现 四、一元多项式的表示及相加 五、本章小结
数据结构
2/58
一、线性表的定义
第2章 线性表
线性结构的特点:在数据元素的非空有限集中
(1)存在惟一的一个被称作“第一个”的数据元素;
(2)存在惟一的一个被称作“最后一个”的数据元素;
n
Edl qi (n i)
i 1
等概率情况下(
pi
1 n 1
,
1 qi n
)
Eis
1 n 1
n1 i 1
(n i
1)
n 2
Edl
1 n
n i 1
(n i)
《数据结构A》第02章
……. private:
Node<T>* first; };
顺序表类SeqList、单链表类SingleList是抽象线性 表类LinearList类的派生类。
LinearList
SeqList
SingleList
friend Node
构造函数 SingleList(){ first=NULL; n=0; }
} if (i<0 || i>n-1) {
cout<<"Out Of Bounds"<<endl; return false; } //从前往后逐个前移元素 for (int j=i+1;j<n;j++) elements[j-1]=elements[j]; n--; return true; }
void main() {
线性表ADT
ADT LinearList { 数据:
0个或多个元素的线性序列(a0,a1,...,an-1),其最 大允许长度为MaxListSize。 运算:
Create(): 创建一个空线性表。 Destroy():撤消一个线性表。 IsEmpty():若线性表空,则返回true;否则返 回false。 Length(): 返回表中元素个数。
……
LinearList
SingleList
…… private://私有数据
int maxLength; //顺序表的最大长度 T *elements; //动态一维数组的指针
};
动态存储分配 构造函数,构建一个空线性表
template <class T> SeqList<T>::SeqList(int mSize) {
考研数据结构chapt2
2.1 线性表及其基本运算 2.2 线性表的顺序存储结构 2.3 线性表的链式存储结构
线性表的逻辑结构,物理结构, 线性表的逻辑结构,物理结构,以及它 们之间的相互关系; 们之间的相互关系; 定义与之相适应的运算; 定义与之相适应的运算; 设计相应的算法; 设计相应的算法; 分析算法的效率. 分析算法的效率.
2.1 线性表及其基本运算
LOCATE( LOCATE(L,x) 定位函数 给定值x 给定值x,若x不在表中, 不在表中,
则返回0 否则,返回x 则返回0,否则,返回x在表中第一次出现时的位序 INSERTE( INSERTE(L, i , b)前插操作 在第i个元素之前插入新元 b) 在第i 的取值范围为:1<=i<=n+1; =n+1表示在表尾插 素b,i 的取值范围为:1<=i<=n+1;i =n+1表示在表尾插 入, n为表长 DELETE( DELETE(L,i) 删除操作 元素, 1<=i<=n 元素, 1<=i<=n 删除线性表L中的第i 删除线性表L中的第i个
ii称为该数据元称为该数据元priorpriorllelmelm求前驱函数求前驱函数elmelm为为ll中的一个数据元素中的一个数据元素若它的位序大于11则函数值为则函数值为elmelm前驱否则为前驱否则为nullnullnextnextllelmelm求后继函数求后继函数若若elmelm的位序小于表长则函数值为则函数值为elmelm的后继否则为的后继否则为nullnulllocatelocatellxx定位函数定位函数给定值给定值xx若若xx不在表中不在表中则返回则返回00否则返回否则返回xx在表中第一次出现时的位序在表中第一次出现时的位序inserteinsertelb前插操作前插操作在第ii个元素之前插入新元个元素之前插入新元素素bbi的取值范围为
数据结构CHAP2
void MergeList(List La, List Lb, List &Lc) { // 本算法将非递减的有序表 La 和 Lb 归并为 Lc InitList(Lc); // 构造空的线性表 Lc i = j = 1; k = 0; La_len = ListLength(La); Lb_len = ListLength(Lb); while ((i <= La_len) && (j <= Lb_len)) { GetElem(La, i, ai); GetElem(Lb, j, bj); if (ai <= bj) { // 将 ai 插入到 Lc 中 ListInsert(Lc, ++k, ai); ++i; } else { // 将 bj 插入到 Lc 中 ListInsert(Lc, ++k, bj); ++j; }}
例 2-1 例 2-2
例 2-1
假设:有两个集合 A 和 B 分别用 集合 两个线性表 LA 和 LB 表示,即: 线性表 线性表中的数据元素即为集合中的 成员。 现要求一个新的集合A= ∪ 现要求一个新的集合 =A∪B。
上述问题可演绎为:
要求对线性表作如下操作: 扩大线性表 LA,将存在于线性表 存在于线性表 LB 中而不存在于线性表 LA 中的 不存在于线性表 数据元素插入到线性表 LA 中去。 插入到线性表
线性表是一种最简单的线性结构 线性结构 线性表
线性结构的基本特征: 线性结构的基本特征: 基本特征
线性结构 是 一个数据元素的有序 次序) 有序( 一个数据元素的有序(次序)集
1.集合中必存在唯一的一个“第一元素”; .集合中必存在唯一的一个“第一元素” 2.集合中必存在唯一的一个 “最后元素” . 最后元素” 3.除最后元素在外,均有 唯一的后继; .除最后元素在外, 唯一的后继; 4.除第一元素之外,均有 唯一的前驱。 .除第一元素之外, 唯一的前驱。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Contents
Stack Containers
A stack allows access at only one end of the sequence, called the top.
top top
A
C
B A
C
top
top
B A
B A
top
A
B
Push A
Push B (a)
Push C
Pop C
16
Main Index Contents
CLASS vector
Operations
<vector>
void push_back(const T& value); Add a value at the rear of the vector. Postcondition: The vector has a new element at the rear and its size increases by 1. void pop_back(); Remove the item at the rear of the vector. Precondition: The vector is not empty. Postcondition: The vector has a new element at the rear or is empty.
B
C
D
E
D elete
8
Main Index
Contents
Priority Queue Containers
A priority queue is a storage structure that has restricted access operations similar to a stack or queue. Elements can enter the priority queue in any order. Once in the container, a delete operation removes the largest (or smallest) value. V alue = 8
10
Main Index
Contents
Map Containers
A map is a storage structure that implements a keyvalue relationship.
Index A 29-468 D 7B -916 W 91-A 83
P art # D 7B -916 W 91-A 83 A 29-468
P rice 4.95 12.50 8.75
Vendor M irage C allow ay M art in
11
Main Index
Contents
Vectors
v[0]
v[1]
v[2]
. . .
v [ n-1 ]
ro o m to gro w
0
1
2
n-1
12
Main Index
Conts itio n 2
P o s itio n 3
P o s itio n 4
3
Main Index
Contents
Associative Containers
Associative containers store elements by key.
–
Ex: name, social security number, or part number.
Sequence Containers Adapter Containers Associative Containers
Vector
Stack
Set, Multiset
Map, Mutltimap
Deque(双端队列) Queue
List Priority Queue
2
Main Index
Contents
17
Main Index
Contents
CLASS vector
Operations
<vector>
void resize((int n, const T& fill = T()); Modify the size of the vector. If the size is increased, the value fill is added to the elements on the tail of the vector. If the size is decreased, the original values at the front are retained. Postcondition: The vector has size n. int size() const; Return the number of elements in the vector.
Pop B (b)
7
Main Index
Contents
Queue Containers
A queue is a container that allows access only at the front and rear of the sequence.
A
B
C
D Ins ert E rear A fro nt
– The Vector Container
Container Types Vectors
-Constructor
Chapter 4
-Operations
Sequence Containers
- List - Declaring Vector Objects -Adding and Removing Elements -Resizing a Vector -Output with Vectors -Joining Sorted Sublists
A program accesses an element in an associative container by its key, which may bear no relationship to the location of the element in the container.
14
Main Index
Contents
CLASS vector
Operations
<vector>
T& back(); Return the value of the item at the rear of the vector. Precondition: The vector must contain at least one element. const T& back() const; Constant version of back(). bool empty() const; Return true if the vector is empty and false otherwise.
18
Main Index
Contents
Output with Vectors
// number of elements in list is v.size()
template <typename T> void writeVector ( const vector<T>& v ) {
// capture the size of the vector in n
13
Main Index Contents
CLASS vector
Constructors
<vector>
vector(T *first, T *last); Initialize the vector using the address range [first,last). The notation *first and *last is a pointer notation.
18 3 15 13
27
9
Main Index
Contents
Set Containers
A set is a collection of unique values, called keys or set members.
S et A 5 3 27 15 1 S et B Buic k F o rd H o nd a BM W Jaguar Jeep
CLASS vector
Constructors
<vector>
vector(); Create an empty vector. This is the default constructor. vector(int n, const T& value = T()); Create a vector with n elements, each having a specified value. If the value argument is omitted, the elements are filled with the default value for type T. Type T must have a default constructor, and the default value of type T is specified by the notation T().
4
Main Index
Contents
Adapter Containers
An adapter contains another container as its underlying storage structure. The programmer interface for an adapter provides only a restricted set of operations from the underlying storage structure.